2

我想在 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()
4

2 回答 2

2

首先,您应该阅读文档以更好地了解其eventlet工作原理和使用方法。我自己从未使用过eventlet,我通过浏览文档几分钟了解了接下来的所有内容。

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

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

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

您需要对time模块进行猴子修补,以使其在睡眠时自愿放弃控制。由于您还没有这样做,因此在主线程处于睡眠状态时,生成的线程无法工作。结果,线程直到循环的第 4 次迭代才运行。此时,主线程不能再产生任何线程,因此它“阻塞”并将控制权交给工作线程。

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

于 2016-05-03T07:07:34.970 回答
1

构造函数的参数GreenPool是将使用的工作线程数。通过传递数字 4,您告诉它self.do_work最多同时调用四次。由于您调用spawn了 10 次,因此您已将 10 个“工作”排队,所以这就是do_work将被调用的次数。并行度(在本例中为 4)不会影响任务执行的次数,而是限制可能同时运行的线程数量。

于 2016-05-03T06:55:49.697 回答