我正在尝试Python 3中的多处理,我遇到了一些奇怪的行为(好吧,至少对我来说这很奇怪!)。
基本上,我创建了一个包含10个随机数的列表。然后我遍历一个范围(在我的例子中,它是2),并且对于每次迭代,我使用pool.apply_async
并行处理随机数。 “处理”的结果存储在列表中,以便在完成所有处理后,我可以打印结果。我希望看到2 * 10的结果。
然而,我发现,由于某种原因,我只看到2个结果(即我的第一个循环中的2个迭代):
import multiprocessing
import time
import random
class Calculator:
def calculate(self, links):
print("LENGHT:", len(links)) # 48
tups=[]
for datasetlink in links:
print(datasetlink)
tups.append("GO", datasetlink)
return tups
dslinks = random.sample(range(1, 101), 10)
result_list = []
def Process(datasetlinks):
calc = Calculator();
tups = calc.calculate(datasetlinks)
return tups;
def log_result(result):
result_list.append(result)
def apply_async_with_callback():
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
for i in range(2):
pool.apply_async(Process, args = (dslinks,), callback = log_result)
pool.close()
pool.join()
DoPrintResults()
def DoPrintResults():
for result in result_list:
print(result)
if __name__ == '__main__':
start = time.time()
apply_async_with_callback()
end = time.time()
print("Execution took: ", (end-start), " seconds")
如果我从tups=[]
函数中移除tups.append("GO", datasetlink)
,return tups
和Calculator.calculate
,一切都按预期工作,我看到for-loop
Calculator.calculate
被击中20次。
我做错了什么?
答案 0 :(得分:0)
问题在于这一行:
tups.append("GO", datasetlink)
将其更改为:
tups.append(datasetlink)
调试多进程代码可能很棘手。调试它的一种方法是使用异常。将Process
中的所有内容放在try
块中:
def Process(datasetlinks):
try:
calc = Calculator();
tups = calc.calculate(datasetlinks)
except:
print(sys.exc_info()[0])
return tups;
这给了我<type 'exceptions.NameError'>
,当我移动try块来计算:
def calculate(self, links):
try:
print("LENGHT:", len(links)) # 48
tups=[]
for datasetlink in links:
print(datasetlink)
tups.append("GO", datasetlink)
except:
print(sys.exc_info()[0])
return tups
我改为<type 'exceptions.TypeError'>