我想在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()
答案 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)不会影响任务执行的次数,而是限制可以同时运行的线程数。