Python 多处理 - apply_async 不工作
Python multiprocessing - apply_async not working
我正在尝试使用线程池并行化代码。我目前正在研究 windows。基本上,我得到的行为是当我调用 apply_async 时什么也没有发生。我的程序只打印开始和结束。
下面有一个例子:
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、apply。但是,其中 none 个解决了问题。
编辑:
results.get()
returns参数个数错误:
TypeError: ppp() takes 2 positional arguments but 10 were given
然而,文档指出我可以使用元组列表来传递参数,否则我如何传递它们?
编辑2:
processes_args
在调用 apply_async:
之前看起来像下面的输出
[(2000, '0808'),
(2000, '0810'),
(2000, '0812'),
(2000, '0813'),
(2000, '0814'),
(2000, '0817'),
(2000, '0818'),
(2000, '0827'),
(2000, '0828'),
(2000, '0829')]
Pool.apply
和 Pool.apply_async
中的位置参数使用 * unpacking syntax 展开。
根据 processed_args
内容,您的 ppp
函数在通过 apply_async
调度时将接收 10 个元组。
如果你想处理一个可迭代对象,我建议你使用Pool.map
或Pool.map_async
。 map
函数不会扩展可迭代对象中的参数。你需要自己处理。
def ppp(element):
window, day = element
print(window, day)
pool.map(ppp, processed_args)
如果您想保持 ppp
函数不变,您可以使用 Pool.starmap
对迭代器内容应用参数扩展。
我正在尝试使用线程池并行化代码。我目前正在研究 windows。基本上,我得到的行为是当我调用 apply_async 时什么也没有发生。我的程序只打印开始和结束。
下面有一个例子:
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、apply。但是,其中 none 个解决了问题。
编辑:
results.get()
returns参数个数错误:
TypeError: ppp() takes 2 positional arguments but 10 were given
然而,文档指出我可以使用元组列表来传递参数,否则我如何传递它们?
编辑2:
processes_args
在调用 apply_async:
[(2000, '0808'),
(2000, '0810'),
(2000, '0812'),
(2000, '0813'),
(2000, '0814'),
(2000, '0817'),
(2000, '0818'),
(2000, '0827'),
(2000, '0828'),
(2000, '0829')]
Pool.apply
和 Pool.apply_async
中的位置参数使用 * unpacking syntax 展开。
根据 processed_args
内容,您的 ppp
函数在通过 apply_async
调度时将接收 10 个元组。
如果你想处理一个可迭代对象,我建议你使用Pool.map
或Pool.map_async
。 map
函数不会扩展可迭代对象中的参数。你需要自己处理。
def ppp(element):
window, day = element
print(window, day)
pool.map(ppp, processed_args)
如果您想保持 ppp
函数不变,您可以使用 Pool.starmap
对迭代器内容应用参数扩展。