Eventlet和Python守护进程,Foo没有被调用?

时间:2011-07-06 11:01:01

标签: python queue coroutine eventlet

我正在尝试构建一个侦听队列(Redis Kombu)的Python守护程序。 抓住任务并生成一个greenthread来处理这个任务。

我可以毫无困难地接收任务并使用它,但是当我尝试使用eventlet生成GreenThread时,它似乎根本没有做任何事情。

没有打印,没有显示记录。

class agent(Daemon):
    """
    Agent
    """
    def run(self):  
        # Setup connection
        mainLogger.debug('Connecting to Redis')
        connection = BrokerConnection(
                        hostname=agentConfig['redis_host'],
                        transport="redis",
                        virtual_host=agentConfig['redis_db'],
                        port=int(agentConfig['redis_port']))
        connection.connect()

        # Create an eventlet pool of size 5
        pool = eventlet.GreenPool(5)
        q = connection.SimpleQueue("myq")
        while True:
            try:
               message = q.get(block=True, timeout=1)
               print "GOT A MESSAGE FROM Q !"
               pool.spawn_n(self.foo, 'x')
               print "END SPAWN !"
            except Empty:
               mainLogger.debug('No tasks, going to sleep')
               time.sleep(1)


    def foo(self, x):
        mainLogger.debug('\o/')
        print "HELLO FROM SPAWN"

我做错了什么?

2 个答案:

答案 0 :(得分:3)

我需要调用eventlet.monkey_patch()进行sleep()调用以触发上下文切换。

答案 1 :(得分:2)

您只需使用此处所述的eventlet.sleep

http://eventlet.net/doc/basic_usage.html#eventlet.sleep