我正在尝试将代码与ThreadPool并行化。我目前正在Windows上工作。基本上,我得到的行为是,当我调用apply_async时,什么也没有发生。我的程序只打印START和END。
下面有一个例子:
import glob
import itertools
import pandas as pd
from multiprocessing.dummy import Pool as ThreadPool
def ppp(window,day):
print(window,day)
#%% Reading datasets
print('START')
tree = pd.read_csv('datan\\days.csv')
days = list(tree.columns)
windows = [2000]
processes_args = list(itertools.product(windows, days))
pool = ThreadPool(8)
results = pool.apply_async(ppp, processes_args)
pool.close()
pool.join()
print('END')
堆栈上有很多问题,建议您调用其他方法,例如imap_unordered,map。但是,它们都不能解决问题。
编辑:
results.get()
返回有关参数数量的错误:
TypeError: ppp() takes 2 positional arguments but 10 were given
但是,文档指出我可以使用元组列表来传递参数,否则如何传递它们?
Edit2:
processes_args
类似于下面的输出,然后调用apply_async:
[(2000, '0808'),
(2000, '0810'),
(2000, '0812'),
(2000, '0813'),
(2000, '0814'),
(2000, '0817'),
(2000, '0818'),
(2000, '0827'),
(2000, '0828'),
(2000, '0829')]
答案 0 :(得分:3)
使用* unpacking syntax扩展Pool.apply
和Pool.apply_async
中的位置参数。
根据processed_args
的内容,当您通过ppp
进行调度时,您的apply_async
函数将收到10个元组。
如果您要处理迭代,建议您使用Pool.map
或Pool.map_async
。 map
函数不会在Iterable中扩展参数。您需要自己照顾它。
def ppp(element):
window, day = element
print(window, day)
pool.map(ppp, processed_args)
如果您想保持ppp
函数不变,可以使用Pool.starmap
,它将参数扩展应用于迭代器内容。