本文整理汇总了Python中eventlet.queue.Queue.put方法的典型用法代码示例。如果您正苦于以下问题:Python Queue.put方法的具体用法?Python Queue.put怎么用?Python Queue.put使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类eventlet.queue.Queue
的用法示例。
在下文中一共展示了Queue.put方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: EventletInbox
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
class EventletInbox(object):
def __init__(self, logger=None):
''' __init__ '''
self.__inbox = EventletQueue()
if logger is None:
self._logger = getLogger('%s.EventletInbox' % __name__)
else:
self._logger = logger
def get(self):
''' get data from inbox '''
try:
result = self.__inbox.get_nowait()
except EventletEmpty:
raise EmptyInboxException
return result
def put(self, message):
''' put message to inbox '''
self.__inbox.put(message)
def __len__(self):
''' return length of inbox '''
return self.__inbox.qsize()
示例2: LocalMailbox
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
class LocalMailbox(Mailbox):
def __init__(self):
self._queue = Queue()
def put(self, message):
self._queue.put(message)
def get(self):
return self._queue.get()
示例3: MethodReader
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
class MethodReader(object):
"""
Helper class to receive frames from the broker, combine them if
necessary with content-headers and content-bodies into complete methods.
Normally a method is represented as a tuple containing
(channel, method_sig, args, content).
In the case of a framing error, an AMQPConnectionException is placed
in the queue.
In the case of unexpected frames, a tuple made up of
(channel, AMQPChannelException) is placed in the queue.
"""
def __init__(self, source):
self.source = source
self.queue = Queue()
self.running = False
self.partial_messages = {}
# For each channel, which type is expected next
self.expected_types = defaultdict(lambda:1)
def _next_method(self):
"""
Read the next method from the source, once one complete method has
been assembled it is placed in the internal queue.
"""
while self.queue.empty():
try:
frame_type, channel, payload = self.source.read_frame()
except Exception, e:
#
# Connection was closed? Framing Error?
#
self.queue.put(e)
break
if self.expected_types[channel] != frame_type:
self.queue.put((
channel,
Exception('Received frame type %s while expecting type: %s' %
(frame_type, self.expected_types[channel])
)
))
elif frame_type == 1:
self._process_method_frame(channel, payload)
elif frame_type == 2:
self._process_content_header(channel, payload)
elif frame_type == 3:
self._process_content_body(channel, payload)
示例4: Actor
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
class Actor(ActorBase):
def __init__(self, callback):
self._inbox = Queue()
self._callback = callback
self._greenlet = None
def run(self, *args, **kwargs):
greenlet_id = id(eventlet.getcurrent())
_actor_map[greenlet_id] = self
try:
self._callback(*args, **kwargs)
finally:
del _actor_map[greenlet_id]
def spawn(self, *args, **kwargs):
self._greenlet = _actor_pool.spawn(self.run, *args, **kwargs)
def link(self, func, *args, **kwargs):
if self._greenlet is None:
return
return self._greenlet.link(func, *args, **kwargs)
def unlink(self, func, *args, **kwargs):
if self._greenlet is None:
return
return self._greenlet.unlink(func, *args, **kwargs)
def cancel(self, *throw_args):
if self._greenlet is None:
return
return self._greenlet.cancel(*throw_args)
def kill(self, *throw_args):
if self._greenlet is None:
return
return self._greenlet.kill(*throw_args)
def wait(self):
if self._greenlet is None:
return
return self._greenlet.wait()
def send(self, message):
self._inbox.put(message)
def receive(self):
return self._inbox.get()
示例5: LocalMailbox
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
class LocalMailbox(Mailbox):
def __init__(self):
self._queue = Queue()
def put(self, message):
self._queue.put(message)
def get(self):
return self._queue.get()
def encode(self):
raise NotImplementedError
@staticmethod
def decode(params):
raise NotImplementedError
示例6: DownloadPool
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
class DownloadPool(object):
def __init__(self, settings):
self.temp_dir = settings['temp_dir']
self.download_path = settings['download_path']
self.connection_pool = Queue(settings['connections'])
for _ in xrange(settings['connections']):
self.connection_pool.put(NNTP(settings['host'], settings['port'], settings['username'], settings['password']))
def download(self, segment):
#print 'getting', segment['segment']
# Get an availble connection; if there are none, block until available.
connection = self.connection_pool.get()
segment_path = connection.get_body(segment['segment'], self.temp_dir)
# Connection is done, put it back in the ready queue.
self.connection_pool.put(connection)
#print 'got', segment_path
Tracker.downloaded += segment['segment_bytes']
#print Tracker.downloaded
return segment_path
示例7: EventletConnection
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
#.........这里部分代码省略.........
if self._write_watcher and self._write_watcher != cur_gthread:
self._write_watcher.kill()
if self._socket:
self._socket.close()
log.debug("Closed socket to %s" % (self.host,))
if not self.is_defunct:
self.error_all_callbacks(
ConnectionShutdown("Connection to %s was closed" % self.host))
# don't leave in-progress operations hanging
self.connected_event.set()
def handle_write(self):
while True:
try:
next_msg = self._write_queue.get()
self._socket.send(next_msg)
except socket.error as err:
log.debug(
"Exception during socket sendall for %s: %s", self, err)
self.defunct(err)
return # Leave the write loop
def handle_read(self):
run_select = partial(select.select, (self._socket,), (), ())
while True:
try:
run_select()
except Exception as exc:
if not self.is_closed:
log.debug(
"Exception during read select() for %s: %s", self, exc)
self.defunct(exc)
return
try:
buf = self._socket.recv(self.in_buffer_size)
self._iobuf.write(buf)
except socket.error as err:
if not is_timeout(err):
log.debug(
"Exception during socket recv for %s: %s", self, err)
self.defunct(err)
return # leave the read loop
if self._iobuf.tell():
while True:
pos = self._iobuf.tell()
if pos < 8 or (self._total_reqd_bytes > 0
and pos < self._total_reqd_bytes):
# we don't have a complete header yet or we
# already saw a header, but we don't have a
# complete message yet
break
else:
# have enough for header, read body len from header
self._iobuf.seek(4)
body_len = int32_unpack(self._iobuf.read(4))
# seek to end to get length of current buffer
self._iobuf.seek(0, os.SEEK_END)
pos = self._iobuf.tell()
if pos >= body_len + 8:
# read message header and body
self._iobuf.seek(0)
msg = self._iobuf.read(8 + body_len)
# leave leftover in current buffer
leftover = self._iobuf.read()
self._iobuf = StringIO()
self._iobuf.write(leftover)
self._total_reqd_bytes = 0
self.process_msg(msg, body_len)
else:
self._total_reqd_bytes = body_len + 8
break
else:
log.debug("connection closed by server")
self.close()
return
def push(self, data):
chunk_size = self.out_buffer_size
for i in xrange(0, len(data), chunk_size):
self._write_queue.put(data[i:i + chunk_size])
def register_watcher(self, event_type, callback, register_timeout=None):
self._push_watchers[event_type].add(callback)
self.wait_for_response(
RegisterMessage(event_list=[event_type]),
timeout=register_timeout)
def register_watchers(self, type_callback_dict, register_timeout=None):
for event_type, callback in type_callback_dict.items():
self._push_watchers[event_type].add(callback)
self.wait_for_response(
RegisterMessage(event_list=type_callback_dict.keys()),
timeout=register_timeout)
示例8: StatsdLog
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
#.........这里部分代码省略.........
lastcount = 0
lasthit = 0
while True:
eventlet.sleep(2)
lps = (self.counter - lastcount) / 60
hps = (self.hits - lasthit) / 60
lastcount = self.counter
lasthit = self.hits
self.logger.info("per second: %d lines - hits %d" % (lps, hps))
self.logger.info("totals: %d hits - %d lines" % (self.hits, self.counter))
if self.skip_counter is not 0:
self.logger.info("Had to skip %d log lines so far" % self.skip_counter)
def send_event(self, payload):
"""
Fire event to statsd
:param payload: The payload of the udp packet to send.
"""
try:
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.sendto(payload, self.statsd_addr)
except Exception:
# udp sendto failed (socket already in use?), but thats ok
self.logger.error("Error trying to send statsd event")
def statsd_counter_increment(self, stats, delta=1):
"""
Increment multiple statsd stats counters
:param stats: list of stats items to package and send
:param delta: delta of stats items
"""
if self.statsd_sample_rate < 1:
if random() <= self.statsd_sample_rate:
for item in stats:
payload = "%s:%s|c|@%s" % (item, delta, self.statsd_sample_rate)
self.send_event(payload)
else:
for item in stats:
payload = "%s:%s|c" % (item, delta)
self.send_event(payload)
def worker(self):
"""
Check for and process log lines in queue
"""
while True:
msg = self.q.get()
matched = self.check_line(msg)
if matched:
self.statsd_counter_increment([matched])
if self.hits >= maxint:
self.logger.info("hit maxint, reset hits counter")
self.hits = 0
self.hits += 1
else:
pass
def listener(self):
"""
syslog udp listener
"""
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
bind_addr = (self.listen_addr, self.listen_port)
sock.bind(bind_addr)
self.logger.info("listening on %s:%d" % bind_addr)
while 1:
data, addr = sock.recvfrom(self.buff)
if not data:
break
else:
if self.q.qsize() < self.max_q_size:
self.q.put(data)
if self.counter >= maxint:
self.logger.info("hit maxint, reset seen counter")
self.counter = 0
self.counter += 1
else:
if self.debug:
self.logger.notice("max log lines in queue, skipping")
if self.skip_counter >= maxint:
self.logger.info("hit maxint, reset skip counter")
self.skip_counter = 0
self.skip_counter += 1
def start(self):
"""
Start the listener, worker, and mgmt server.
"""
eventlet.spawn_n(self.worker)
if self.debug:
eventlet.spawn_n(self.stats_print)
if self.report_internal_stats:
eventlet.spawn_n(self.internal_stats)
while True:
try:
self.listener()
except Exception as err:
self.logger.error(err)
示例9: EventletConnection
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
#.........这里部分代码省略.........
def __init__(self, *args, **kwargs):
Connection.__init__(self, *args, **kwargs)
self.connected_event = Event()
self._write_queue = Queue()
self._callbacks = {}
self._push_watchers = defaultdict(set)
self._connect_socket()
self._read_watcher = eventlet.spawn(lambda: self.handle_read())
self._write_watcher = eventlet.spawn(lambda: self.handle_write())
self._send_options_message()
def close(self):
with self.lock:
if self.is_closed:
return
self.is_closed = True
log.debug("Closing connection (%s) to %s" % (id(self), self.host))
cur_gthread = eventlet.getcurrent()
if self._read_watcher and self._read_watcher != cur_gthread:
self._read_watcher.kill()
if self._write_watcher and self._write_watcher != cur_gthread:
self._write_watcher.kill()
if self._socket:
self._socket.close()
log.debug("Closed socket to %s" % (self.host,))
if not self.is_defunct:
self.error_all_callbacks(
ConnectionShutdown("Connection to %s was closed" % self.host))
# don't leave in-progress operations hanging
self.connected_event.set()
def handle_close(self):
log.debug("connection closed by server")
self.close()
def handle_write(self):
while True:
try:
next_msg = self._write_queue.get()
self._socket.sendall(next_msg)
except socket.error as err:
log.debug("Exception during socket send for %s: %s", self, err)
self.defunct(err)
return # Leave the write loop
def handle_read(self):
run_select = partial(select.select, (self._socket,), (), ())
while True:
try:
run_select()
except Exception as exc:
if not self.is_closed:
log.debug("Exception during read select() for %s: %s",
self, exc)
self.defunct(exc)
return
try:
buf = self._socket.recv(self.in_buffer_size)
self._iobuf.write(buf)
except socket.error as err:
if not is_timeout(err):
log.debug("Exception during socket recv for %s: %s",
self, err)
self.defunct(err)
return # leave the read loop
if self._iobuf.tell():
self.process_io_buffer()
else:
log.debug("Connection %s closed by server", self)
self.close()
return
def push(self, data):
chunk_size = self.out_buffer_size
for i in xrange(0, len(data), chunk_size):
self._write_queue.put(data[i:i + chunk_size])
def register_watcher(self, event_type, callback, register_timeout=None):
self._push_watchers[event_type].add(callback)
self.wait_for_response(
RegisterMessage(event_list=[event_type]),
timeout=register_timeout)
def register_watchers(self, type_callback_dict, register_timeout=None):
for event_type, callback in type_callback_dict.items():
self._push_watchers[event_type].add(callback)
self.wait_for_response(
RegisterMessage(event_list=type_callback_dict.keys()),
timeout=register_timeout)
示例10: RelayServer
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
class RelayServer(object):
def __init__(self, hostname, port):
self._address = (hostname, port)
self._clients = {}
self._messages = []
self._pool = eventlet.GreenPool(256)
self._queue = Queue()
def start(self):
server = eventlet.listen(self._address)
eventlet.spawn(self._broadcast)
while True:
sock, address = server.accept()
print "Accepted connection from {}".format(address)
self._clients[address] = sock
self._pool.spawn_n(self._handle_client, sock, address)
def _handle_client(self, client, address):
buffer = LineBuffer(self._receive, address)
while True:
buffer.receive(client.recv(4096))
def _receive(self, message, address):
self._handle_message(message, address)
def _handle_message(self, message, address):
try:
structure = json.loads(message)
except ValueError:
structure = {"id": str(uuid.uuid4()),
"message": message.rstrip()}
payload = structure['message']
if payload.startswith("connect "):
address = payload[8:].split(':')
self._connect((address[0], int(address[1])))
elif payload == "source":
self._clients[address].sendall(open(__file__).read())
else:
structure['address'] = address
self._send(json.dumps(structure), address)
def _send(self, message, address):
self._queue.put((message, address))
def _broadcast(self):
while True:
message, address = self._queue.get()
try:
payload = json.loads(message)
except ValueError:
print "Unable to send message: '{!r}'".format(message)
continue
if payload['id'] not in self._messages:
self._messages = [payload['id']] + self._messages[:256]
for client_address, client in self._clients.items():
if client_address != address:
client.sendall(message + "\n")
def _connect(self, address):
sock = eventlet.connect(address)
self._clients[address] = sock
self._pool.spawn_n(self._handle_client, sock, address)
print "Connected to {!r}".format(address)
示例11: Connection
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
#.........这里部分代码省略.........
def __add_route(self, advert_entries, attributes):
# XXX acquire route table lock?
# XXX remove duplicate
for entry in advert_entries:
entry.attributes = attributes
Server.route_table.append(entry)
def __remove_route(self, withdraw_entries):
# XXX acquire route table lock?
for i in withdraw_entries:
for j in Server.route_table:
if i == j:
Server.route_table.remove(j)
def _handle_notification(self, msg):
LOG.error('BGP error code %s, error sub code %s',
msg.err_code, msg.err_subcode)
def _handle_keepalive(self, msg):
self.peer_last_keepalive_timestamp = time.time()
@_deactivate
def _send_loop(self):
try:
while self.is_active:
buf = self.send_q.get()
self.socket.sendall(buf)
finally:
self.send_q = None
def send(self, buf):
if self.send_q:
self.send_q.put(buf)
def serve(self):
send_thr = hub.spawn(self._send_loop)
try:
self._recv_loop()
finally:
hub.kill(send_thr)
hub.joinall([send_thr])
#
# Utility methods for convenience
#
def send_open_msg(self):
open_reply = BGP4.bgp4_open(version=4, my_as=Server.local_as,
hold_time=self.hold_time,
bgp_identifier=Server.local_ipv4,
data=Server.capabilities)
bgp4_reply = BGP4.bgp4(type_=BGP4.BGP4_OPEN, data=open_reply)
self.serialize_and_send(bgp4_reply)
def send_keepalive_msg(self):
keepalive = BGP4.bgp4(type_=BGP4.BGP4_KEEPALIVE, data=None)
self.serialize_and_send(keepalive)
def send_notification_msg(self, err_code, err_subcode, data):
"""
input: err_code, err_subcode, and data
output: send msg
"""
notification_msg = BGP4.bgp4_notification(err_code, err_subcode, data)
示例12: Crawler
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
class Crawler(object):
def __init__(self, max_connections, input_is_plain):
self.max_connections = max_connections
self.input_is_plain = input_is_plain
self.queue = Queue(1)
self.closed = False
self._handler_pool = GreenPool(self.max_connections)
self._robots_cache = PoolMap(self.get_robots_checker, pool_max_size=1, timeout=600)
# Start IO worker and die if he does.
self.io_worker = io.Worker(lambda: self.closed)
t = spawn(self.io_worker.run_loop)
t.link(reraise_errors, greenthread.getcurrent())
log.debug(u"Crawler started. Max connections: %d.", self.max_connections)
def crawl(self, forever=True):
# TODO: do something special about signals?
if forever:
self.start_queue_updater()
while not self.closed:
# `get_nowait` will only work together with sleep(0) here
# because we need greenlet switch to reraise exception from `do_process`.
sleep()
try:
item = self.queue.get_nowait()
except Empty:
if not forever:
self.graceful_stop()
sleep(0.01)
continue
t = self._handler_pool.spawn(self.do_process, item)
t.link(reraise_errors, greenthread.getcurrent())
def stop(self):
self.closed = True
def graceful_stop(self, timeout=None):
"""Stops crawler and waits for all already started crawling requests to finish.
If `timeout` is supplied, it waits for at most `timeout` time to finish
and returns True if allocated time was enough.
Returns False if `timeout` was not enough.
"""
self.closed = True
if timeout is not None:
with eventlet.Timeout(timeout, False):
if hasattr(self, "_queue_updater_thread"):
self._queue_updater_thread.kill()
self._handler_pool.waitall()
return True
return False
else:
if hasattr(self, "_queue_updater_thread"):
self._queue_updater_thread.kill()
self._handler_pool.waitall()
def start_queue_updater(self):
self._queue_updater_thread = spawn(self.queue_updater)
self._queue_updater_thread.link(reraise_errors, greenthread.getcurrent())
def queue_updater(self):
log.debug("Waiting for crawl jobs on stdin.")
for line in sys.stdin:
if self.closed:
break
line = line.strip()
if self.input_is_plain:
job = {"url": line}
else:
try:
job = json.loads(line)
except ValueError:
log.error(u"Decoding input line: %s", line)
continue
# extend worker queue
# 1. skip duplicate URLs
for queue_item in self.queue.queue:
if queue_item["url"] == job["url"]: # compare URLs
break
else:
# 2. extend queue with new items
# May block here, when queue is full. This is a feature.
self.queue.put(job)
# Stdin exhausted -> stop.
while not self.queue.empty():
sleep(0.01)
sleep(2) # FIXME: Crutch to prevent stopping too early.
self.graceful_stop()
def get_robots_checker(self, scheme, authority):
#.........这里部分代码省略.........
示例13: StatsdLog
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
#.........这里部分代码省略.........
lasthit = 0
while True:
eventlet.sleep(2)
lps = (self.counter - lastcount) / 60
hps = (self.hits - lasthit) / 60
lastcount = self.counter
lasthit = self.hits
self.logger.info('per second: %d lines - hits %d' % (lps, hps))
self.logger.info('totals: %d hits - %d lines' %
(self.hits, self.counter))
if self.skip_counter is not 0:
self.logger.info('Had to skip %d log lines so far' %
self.skip_counter)
def send_event(self, payload):
"""
Fire event to statsd
:param payload: The payload of the udp packet to send.
"""
try:
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.sendto(payload, self.statsd_addr)
except Exception:
# udp sendto failed (socket already in use?), but thats ok
self.logger.error("Error trying to send statsd event")
def statsd_counter_increment(self, stats, delta=1):
"""
Increment multiple statsd stats counters
:param stats: list of stats items to package and send
:param delta: delta of stats items
"""
if self.statsd_sample_rate < 1:
if random() <= self.statsd_sample_rate:
for item in stats:
payload = "%s:%s|c|@%s" % (item, delta,
self.statsd_sample_rate)
self.send_event(payload)
else:
for item in stats:
payload = "%s:%s|c" % (item, delta)
self.send_event(payload)
def worker(self):
"""
Check for and process log lines in queue
"""
while True:
msg = self.q.get()
matches = self.check_line(msg)
for match in matches:
self.statsd_counter_increment([match])
if self.hits >= maxint:
self.logger.info("hit maxint, reset hits counter")
self.hits = 0
self.hits += 1
def listener(self):
"""
syslog udp listener
"""
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
bind_addr = (self.listen_addr, self.listen_port)
sock.bind(bind_addr)
self.logger.info("listening on %s:%d" % bind_addr)
while 1:
data, addr = sock.recvfrom(self.buff)
if not data:
break
else:
if self.q.qsize() < self.max_q_size:
self.q.put(data)
if self.counter >= maxint:
self.logger.info("hit maxint, reset seen counter")
self.counter = 0
self.counter += 1
else:
if self.debug:
self.logger.notice("max log lines in queue, skipping")
if self.skip_counter >= maxint:
self.logger.info("hit maxint, reset skip counter")
self.skip_counter = 0
self.skip_counter += 1
def start(self):
"""
Start the listener, worker, and mgmt server.
"""
eventlet.spawn_n(self.worker)
if self.debug:
eventlet.spawn_n(self.stats_print)
if self.report_internal_stats:
eventlet.spawn_n(self.internal_stats)
while True:
try:
self.listener()
except Exception as err:
self.logger.error(err)
示例14: SockWrapper
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
class SockWrapper(object):
""" base class for SFK and Client(Rengine) sockets wrappers """
NATIVE_PACKET = ScpPacket # placeholder, change it in successors
def __init__(self):
self.queue_send = Queue()
self.queue_recv = Queue()
self.appid = None
# interface
self.sock = None
# interface for packet dispatchers - dockers
def put_packet(self, packet):
self.queue_send.put(packet)
def get_packet(self):
return self.queue_recv.get()
# sender and recver started as greenthreads
def sender(self, callback=lambda: None):
"""get packet from sending queue, send it via sock.
By convention, packet type checking performed
before putting in queue
"""
try:
while True:
packet = self.queue_send.get()
data = packet.assemble()
self.sock.sendall(data)
# TODO if DEBUG
try:
if packet.get_msg_type() == 'pong':
LOGGER.debug('pong sent %s' % self)
except AttributeError:
pass
except Exception:
LOGGER.error(str(self) + " sender error")
eventlet.spawn_n(callback)
def recver(self, callback=lambda: None):
""" recieve packets from sock,
check packet's type,
put packet to recv queue
"""
f = self.sock.makefile()
try:
while True:
try:
packet_class = determine_packet_type(f)
except Disconnection as e:
raise Disconnection
if packet_class == self.NATIVE_PACKET:
packet = packet_class()
packet.read_fields(f)
self.queue_recv.put(packet)
else:
LOGGER.error(
"{0} recver: unexpected magic".format(str(self)))
raise UnexpectedProtocol
except Disconnection as e:
LOGGER.info("Disconnection: {0}".format(str(self)))
except Exception as e:
LOGGER.error("recver error: {0} {1}".format(str(self), str(e)))
LOGGER.info(str(self) + " recver terminate")
eventlet.spawn_n(callback)
def close_socket(self):
try:
self.sock.shutdown(socket.SHUT_RDWR)
self.sock.close()
LOGGER.info("{0} sockwrapper close socket".format(str(self)))
except Exception as e:
LOGGER.error("Fails socket close: %s" % str(e))
示例15: EventletConnection
# 需要导入模块: from eventlet.queue import Queue [as 别名]
# 或者: from eventlet.queue.Queue import put [as 别名]
#.........这里部分代码省略.........
cls._new_timer.set()
return timer
@classmethod
def service_timeouts(cls):
"""
cls._timeout_watcher runs in this loop forever.
It is usually waiting for the next timeout on the cls._new_timer Event.
When new timers are added, that event is set so that the watcher can
wake up and possibly set an earlier timeout.
"""
timer_manager = cls._timers
while True:
next_end = timer_manager.service_timeouts()
sleep_time = max(next_end - time.time(), 0) if next_end else 10000
cls._new_timer.wait(sleep_time)
cls._new_timer.clear()
def __init__(self, *args, **kwargs):
Connection.__init__(self, *args, **kwargs)
self._write_queue = Queue()
self._connect_socket()
self._read_watcher = eventlet.spawn(lambda: self.handle_read())
self._write_watcher = eventlet.spawn(lambda: self.handle_write())
self._send_options_message()
def close(self):
with self.lock:
if self.is_closed:
return
self.is_closed = True
log.debug("Closing connection (%s) to %s" % (id(self), self.host))
cur_gthread = eventlet.getcurrent()
if self._read_watcher and self._read_watcher != cur_gthread:
self._read_watcher.kill()
if self._write_watcher and self._write_watcher != cur_gthread:
self._write_watcher.kill()
if self._socket:
self._socket.close()
log.debug("Closed socket to %s" % (self.host,))
if not self.is_defunct:
self.error_all_requests(
ConnectionShutdown("Connection to %s was closed" % self.host))
# don't leave in-progress operations hanging
self.connected_event.set()
def handle_close(self):
log.debug("connection closed by server")
self.close()
def handle_write(self):
while True:
try:
next_msg = self._write_queue.get()
self._socket.sendall(next_msg)
except socket.error as err:
log.debug("Exception during socket send for %s: %s", self, err)
self.defunct(err)
return # Leave the write loop
def handle_read(self):
run_select = partial(select.select, (self._socket,), (), ())
while True:
try:
run_select()
except Exception as exc:
if not self.is_closed:
log.debug("Exception during read select() for %s: %s",
self, exc)
self.defunct(exc)
return
try:
buf = self._socket.recv(self.in_buffer_size)
self._iobuf.write(buf)
except socket.error as err:
if not is_timeout(err):
log.debug("Exception during socket recv for %s: %s",
self, err)
self.defunct(err)
return # leave the read loop
if self._iobuf.tell():
self.process_io_buffer()
else:
log.debug("Connection %s closed by server", self)
self.close()
return
def push(self, data):
chunk_size = self.out_buffer_size
for i in xrange(0, len(data), chunk_size):
self._write_queue.put(data[i:i + chunk_size])