0

如标题所述

示例代码:

import gevent
from gevent.queue import Queue

class Worker(gevent.Greenlet):
    def __init__(self, sock):
        self.queue = Queue()
        self.sock = sock
        super(Worker, self).__init__()

    def _run(self):
        self.running = True
        while self.running:
            msg_from_queue = self.queue.get()    # block call
            msg_from_sock = self.sock.recv(128)  # block call

worker = Worker(sock)
worker.start()

我想让工人处理两个事件:

  1. 来自袜子的消息接收
  2. 从队列中获取消息

但是这两个都是块调用

我应该怎么做,让工人同时从袜子和队列中获取?

4

2 回答 2

1

我找到了一个方法:

class Worker(gevent.Greenlet):
    def _sock_recv(self):
        # ...
    def _queue_get(self):
        # ...
    def _run(self):
        recv = gevent.spawn(self._sock_recv)
        get = gevent.spawn(self._queue_get)
        gevent.joinall([recv, get])
于 2013-06-17T08:45:31.637 回答
0

分裂Worker成两个工人怎么样?

class QueueWorker(gevent.Greenlet):
    def __init__(self, queue):
        self.queue = queue
        super(QueueWorker, self).__init__()

    def _run(self):
        self.running = True
        while self.running:
            msg = self.queue.get()    # block call
            print 'queue:', msg


class SocketWorker(gevent.Greenlet):
    def __init__(self, sock):
        self.sock = sock
        super(SocketWorker, self).__init__()

    def _run(self):
        self.running = True
        while self.running:
            msg = self.sock.recv(128)  # block call
            print 'socket:', msg

worker1 = QueueWorker(queue)
worker1.start()
worker2 = SocketWorker(sock)
worker2.start()
于 2013-06-17T07:43:51.910 回答