簡體   English   中英

在for循環中使用事件池在python中進行第一次迭代后產生錯誤

[英]Using eventlet pool inside a for loop gives error after first iteration in python

當我運行下面的代碼時,在第二次迭代中出現錯誤。
我想知道是否是因為在生成新池之前沒有終止第一個池? 如果是這樣,我如何終止游泳池?
當我在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'

我對eventlet不熟悉,但是對文檔的簡短瀏覽使我想知道您是否已完成補丁步驟。

編寫類似Eventlet的庫的挑戰之一是內置的網絡庫本身不支持我們需要的那種協作收益。 我們必須做的是在某些關鍵位置修補標准庫模塊,以便它們協同產生。 過去我們曾考慮過在導入Eventlet時自動執行此操作,但已決定不采取這種行動,因為僅通過導入模塊B來更改模塊A的行為就不符合Python規范。

因此,使用Eventlet的應用程序必須使用所提供的一種或兩種便捷方法為自己明確地綠化世界。

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

 import eventlet eventlet.monkey_patch() 

該錯誤與您報告的錯誤相同,並且似乎與修補程序有關,因此您是否完成了修補程序?

更新

我用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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM