win32support.py
73 lines
| 2.1 KiB
| text/x-python
|
PythonLexer
MinRK
|
r3771 | #!/usr/bin/env python | ||
"""Utility for forwarding file read events over a zmq socket. | ||||
MinRK
|
r4021 | This is necessary because select on Windows only supports sockets, not FDs. | ||
MinRK
|
r4018 | |||
Authors: | ||||
* MinRK | ||||
""" | ||||
MinRK
|
r3771 | |||
#----------------------------------------------------------------------------- | ||||
# Copyright (C) 2011 The IPython Development Team | ||||
# | ||||
# Distributed under the terms of the BSD License. The full license is in | ||||
# the file COPYING, distributed as part of this software. | ||||
#----------------------------------------------------------------------------- | ||||
#----------------------------------------------------------------------------- | ||||
# Imports | ||||
#----------------------------------------------------------------------------- | ||||
import uuid | ||||
import zmq | ||||
from threading import Thread | ||||
#----------------------------------------------------------------------------- | ||||
# Code | ||||
#----------------------------------------------------------------------------- | ||||
class ForwarderThread(Thread): | ||||
def __init__(self, sock, fd): | ||||
Thread.__init__(self) | ||||
self.daemon=True | ||||
self.sock = sock | ||||
self.fd = fd | ||||
def run(self): | ||||
MinRK
|
r4021 | """Loop through lines in self.fd, and send them over self.sock.""" | ||
MinRK
|
r3771 | line = self.fd.readline() | ||
# allow for files opened in unicode mode | ||||
if isinstance(line, unicode): | ||||
send = self.sock.send_unicode | ||||
else: | ||||
send = self.sock.send | ||||
while line: | ||||
send(line) | ||||
line = self.fd.readline() | ||||
# line == '' means EOF | ||||
self.fd.close() | ||||
self.sock.close() | ||||
def forward_read_events(fd, context=None): | ||||
MinRK
|
r4021 | """Forward read events from an FD over a socket. | ||
MinRK
|
r3771 | |||
This method wraps a file in a socket pair, so it can | ||||
be polled for read events by select (specifically zmq.eventloop.ioloop) | ||||
""" | ||||
if context is None: | ||||
context = zmq.Context.instance() | ||||
push = context.socket(zmq.PUSH) | ||||
push.setsockopt(zmq.LINGER, -1) | ||||
pull = context.socket(zmq.PULL) | ||||
addr='inproc://%s'%uuid.uuid4() | ||||
push.bind(addr) | ||||
pull.connect(addr) | ||||
forwarder = ForwarderThread(push, fd) | ||||
forwarder.start() | ||||
return pull | ||||
MinRK
|
r4021 | __all__ = ['forward_read_events'] | ||