【问题标题】:Problem using greenlet to execute multiple functions simultaneously使用greenlet同时执行多个功能的问题
【发布时间】:2011-07-12 22:08:22
【问题描述】:

以下脚本的目的是同时执行许多功能,但我不知道为什么它不能正常工作。
函数按顺序执行,而不是并行执行。

如果我有任何建议来澄清我做错了什么,我将不胜感激。

import time
import eventlet


EXECUTION_TIMEOUT = 10

def example(name, steps_limit):
    print 'Starting process %s with %d steps' % (name, steps_limit)
    for i in range(1, steps_limit+1):
        print "Process %s, step %d" % (name, i)
        time.sleep(2)
    print 'Finishing process %s with %d steps' % (name, steps_limit)


def fetch(input_data):
    example(input_data['name'], input_data['steps'])

test_data = [{'name':'proceso1', 'steps':3},
             {'name':'proceso2', 'steps':5},
             {'name':'proceso3', 'steps':6},
             ]

def main():
    #Setting up time out
    timeout = eventlet.timeout.Timeout(EXECUTION_TIMEOUT)
    #initialize pool
    pool = eventlet.GreenPool(size=1000)
    try:
        for hits in pool.imap(fetch, test_data):
            pass
    except eventlet.Timeout:
        print 'Operation interrupted by timeout concept'
    finally:
        timeout.cancel()


if __name__ == '__main__':
    main()

【问题讨论】:

  • 请包括您收到的任何错误消息,并更具体地说明正在发生的事情。它会立即返回吗?它会永远挂起吗?您尝试过什么解决方法?
  • 没有错误信息,它不会永远挂起。问题是该过程以连续的方式发生,而不是无序的。每个功能在前一个完成时开始。我不希望那样。
  • 我已经看到了我的错误。我正在使用“time.sleep”而不是“eventlet.sleep”。不同之处在于最后一个不会阻塞整个解释器,因此也让其他 greenlet 继续处理他们的请求。这次感谢我自己;-)....我希望这个虚拟问题对其他人有所帮助....

标签: python multithreading coroutine


【解决方案1】:

time.sleep() 是罪魁祸首是对的。

但您不必将time.sleep() 替换为eventlet.sleep()。相反,您可以将 time.sleep 修改为 eventlet.sleep

事实上,这是首选,因为这样你不知道使用 time.sleep 的库也会得到修复,而如果你自己修复它,你只会修复你的代码。

因此,在gevent 中,我们只建议为所有程序调用gevent.monkey.patch_all()。在eventlet中,也有类似的功能。

【讨论】:

  • 感谢您的宝贵说明。使用 evenlet,您可以获得相同的效果。 eventlet.monkey_patch() 甚至,你可以指定你想要猴子补丁的模块。例如,仅对于猴子补丁时间模块, eventlet.monkey_patch(time=True)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2019-06-29
  • 2013-05-06
相关资源
最近更新 更多