我正在尝试在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")
如果我从Calculator.calculate
功能中删除tups=[]
、tups.append("GO", datasetlink)
和return tups
,一切都按预期工作,我看到Calculator.calculate
的for-loop
被击中了 20 次。
我做错了什么?
问题是这一行:
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'>