在for循环中使用eventlet池会在python中第一次迭代后出现错误

时间:2016-03-05 02:47:13

标签: python multithreading exception eventlet

当我运行下面的代码时,我在第二次迭代时遇到错误 我想知道是不是因为我在生成新池之前没有终止第一个池?如果是这样,我该如何终止池? 当我在for循环之外定义池时,我得到了同样的错误。

num_parallel_loop = 6;
collect_result = []
for i in range(n):
    pool = eventlet.GreenPool(size=num_parallel_loop)
    for result in pool.imap(func, dictionary.iteritems()):
         collect_result.append(result)

错误:

Exception in thread Thread-4:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(self.__args, *self.__kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 325, in _handle_workers
while thread._state == RUN or (pool._cache and thread._state != TERMINATE):
AttributeError: '_MainThread' object has no attribute '_state'

1 个答案:

答案 0 :(得分:0)

我不熟悉eventlet,但是我对the documentation的简要介绍让我想知道你是否已经完成了补丁步骤。

  

编写像Eventlet这样的库的一个挑战是,内置的网络库本身并不支持我们需要的那种合作产生。我们必须做的是在某些关键位置修补标准库模块,以便它们合作产生。我们过去曾考虑在导入Eventlet时自动执行此操作,但已决定不采取行动,因为仅通过导入模块B来改变模块A的行为是非Pythonic。

     

因此,使用Eventlet的应用程序必须使用提供的一种或两种方便的方法为自己明确地绿化世界。

import eventlet
httplib2 = eventlet.import_patched('httplib2')
     

import eventlet
eventlet.monkey_patch()

This bug您报告的错误相同,而且修补似乎有问题,所以您是否完成了修补?

更新

我尝试了一个带有eventlet的小例子,我没有看到你描述的问题。看看这个例子,看看它是否与你正在做的不同。如果是这样,请在您的问题中提供一个完整的示例。

import eventlet

eventlet.monkey_patch()


def func(item):
    k, s = item
    return k * s

dictionary = {1: 'a',
              2: 'b',
              3: 'c',
              4: 'd',
              5: 'e',
              6: 'f',
              7: 'g',
              8: 'h'}
num_parallel_loop = 6
n = 3
collect_result = []
for i in range(n):
    pool = eventlet.GreenPool(size=num_parallel_loop)
    for result in pool.imap(func, dictionary.iteritems()):
        collect_result.append(result)

print(repr(collect_result))