【发布时间】:2014-12-24 18:02:14
【问题描述】:
我有一个由 for 循环组成的函数,处理每个元素需要很长时间。
在这个循环中,我只关心是否找到一个结果,循环执行的顺序无关紧要。
如果没有找到结果,它只需要处理所有元素。
我的代码如下所示:
import random
from time import sleep
class Elements:
def __init__(self,id):
self.id = id
def analyze(self,result):
sleep(random.random()/2)
if result > 0.9:
return True
def get_result(self):
sleep(random.random()/2)
return random.random()
def long_process(element):
result = element.get_result()
print element.id,result
if element.analyze(result) == True:
return element, result
results.append(result)
if __name__ == '__main__':
elements = []
for n in xrange(10):
elements.append(Elements(n))
results = []
desired = None
for element in elements:
desired = long_process(element)
if desired:
break
if desired:
print desired
else:
print sorted(results,reverse=True)[0]
如果在元素中找到所需的元素,它会输出:
0 0.150771147344
1 0.510095601312
2 0.28908099464
3 0.410008760093
4 0.435872688389
5 0.960307534462
(<__main__.Elements instance at 0x02311AD0>, 0.9603075344618438)
如果不是,它会输出这个:
0 0.361404239639
1 0.207105823026
2 0.851923103243
3 0.720462633138
4 0.58273657804
5 0.380394809851
6 0.590615590942
7 0.130172801534
8 0.57736519194
9 0.597338819896
0.851923103243 # the best element
我正在尝试使用多处理池在单独的线程中处理每个元素。但我没有得到想要的效果。
这是我尝试过的。
def long_process(element):
result = element.get_result()
print element.id,result, element.analyze(result)
if element.analyze(result) == True:
return element, result
results.append(result)
if __name__ == '__main__':
# freeze_support()
pool = Pool(processes=2)
results = []
pool.imap_unordered(long_process,elements)
pool.close()
pool.join()
print sorted(results)[0]
输出:
0 0.257371095047 None
1 0.8533933601 None
2 0.74433029726 None
3 0.138217827732 None
5 1 True
6 0.961344251697 True
4 0.0664381718173 None
7 0.000891701766875 None
9 1 True
8 0.771957314202 None
Traceback (most recent call last):
File "C:/User/user/Documents/Python/threading_test.py", line 40, in <module>
print sorted(results)[0]
IndexError: list index out of range
但这有两个问题:
- 它应该在第 5 个元素处停止,并返回它。
- 如果未找到 True,则应将所有结果存储在结果列表中。
它确实以无序的顺序工作(id 2,3,5,6,4...),它得到了结果,但是当分析为真(5 1 True)时它并没有停止, 也没有将结果附加到结果列表中。[IndexError]
我尝试使用 Pool.apply_async,但我也无法获取结果。
【问题讨论】:
-
您发布的示例的预期输出是什么?
-
如果有
element.analyze(result) == True我希望结果是element, result否则我希望所有结果都存储在结果列表中。在输出的情况下,它将是 id 为 5 和 '1' 的元素
标签: python multithreading asynchronous return