python - Python 多处理 - apply_async 不起作用
问题描述
我正在尝试使用 ThreadPool 并行化代码。我目前正在研究窗户。基本上,我得到的行为是当我调用 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。但是,它们都没有解决问题。
编辑:
results.get()
返回有关参数数量的错误:
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
使用* 解包语法展开。
根据processed_args
内容,您的ppp
函数在通过apply_async
.
如果你想处理一个可迭代的,我建议你使用Pool.map
or Pool.map_async
。这些map
函数不会扩展可迭代对象中的参数。你需要自己照顾它。
def ppp(element):
window, day = element
print(window, day)
pool.map(ppp, processed_args)
如果要保持ppp
函数不变,可以使用Pool.starmap
which 在迭代器内容上应用参数扩展。
推荐阅读
- python - 使用 python 多线程的 Kafka 生产者
- jquery - 可拖动元素 - 如果元素仍在容器 div 内,则防止掉落
- microsoft-teams - 自适应卡片中的可搜索文本块(管理标签中的相同行为添加人员)
- amazon-dynamodb - 如何在没有时间点恢复的情况下导出 DynamoDB 表数据?
- vue.js - 如何在 Vuejs 中制作模态弹出窗口?
- php - 使用冒号(:) 在 functionName 旁边使用 className 的目的是什么
- python - 如何使用熊猫制作不同大小的垃圾箱?
- java - 同时发送和接收 TCP
- java - 不同屏幕尺寸的最佳方式是什么{屏幕宽度 - 屏幕高度 - 最小屏幕宽度}
- mongodb - 如何有条件地使用 mongodb 合并?