在Python中生成后休眠

时间:2016-05-03 06:49:18

标签: python multithreading eventlet green-threads

我想在Python中每1秒启动4个线程来完成一些工作。 为了确保每1秒完成一次工作,我在生成后插入了一个睡眠,如下面的代码片段所示。从打印开始,do_work执行的次数似乎是10,而我期待10 * 4 - >循环迭代次数x线程数。此外,似乎第一个线程在主循环中打印的时间后4秒钟开始工作。(我也在线程中打印了时间)。

    run_pool = GreenPool(4)
    counter = 0
    while counter < 10:
        run_pool.spawn(self.do_work)
        time.sleep(1)
        counter += 1
        print time.time()

2 个答案:

答案 0 :(得分:2)

首先,您应该read the documentation更好地了解eventlet如何运作以及如何使用它。我自己从未使用过eventlet,随后我通过浏览文档几分钟来解决所有问题。

  似乎do_work被执行的次数是10,而我期待10 * 4

GreenPool.spawn()每次调用只产生一个线程。池的大小限制了一次可以运行的线程数。如果池中的所有线程都在使用中,则spawn将阻塞,直到线程可用。

  

似乎第一个线程在主循环中打印的时间后4秒开始工作

你需要对time模块进行猴子修补,使其在睡觉时自愿控制。由于您还没有这样做,所以当主线程处于休眠状态时,生成的线程无法正常工作。因此,线程在循环的第4次迭代之前不会运行。此时,主线程不能再产生任何线程,因此它“阻塞”并产生对工作线程的控制。

在循环之前调用eventlet.monkey_patch()将解决问题。或者,使用eventlet.sleep()代替time.sleep()

答案 1 :(得分:1)

GreenPool的构造函数的参数是将使用的工作线程数。通过传递数字4,您告诉它同时拨打self.do_work最多四次。由于您拨打了spawn十次,因此您排队了10个&#34;就业&#34;,以便do_work被调用多少次。并行度(在这种情况下为4)不会影响任务执行的次数,而是限制可以同时运行的线程数。