![](/img/trans.png)
[英]Python ThreadPool from multiprocessing.pool cannot ultilize all CPUs
[英]Python multiprocessing.pool , ThreadPool is not executing function parallely
我正在尝试读取巨大的 csv 文件并对其执行一些操作并将每个已处理行的结果存储在队列中,我根据 SO 上的答案编写了代码。
但不幸的是,它不起作用,任何帮助将不胜感激。
下面是我的代码。
def process_line(drow):
print('sleeping')
sleep(10)
g_descript = drow['desc']
date_str = g_descript.split('—')
if len(date_str) > 1:
ndt = search_dates(date_str[0])
else:
ndt = None
drow['ndt'] = ndt
q.put(drow)
def get_n_line():
file_path = '/home/ztcUK.csv'
with open(file_path,'r') as f:
cdict = csv.DictReader(f)
for row in cdict:
yield row
if __name__ == '__main__':
f = get_n_line()
p = Pool(processes=10)
n = 0
for i in f:
n = n + 1
print(n)
p.map(process_line,(i,))
p.close()
p.join()
我预计有 10 个并行线程正在运行,但只有 1 个正在运行,我将 sleep 用于调试目的。
下面是 output。
问题是您正在调用pool.map()
,它启动了所有异步运行的进程,但在返回所有结果列表之前等待它们全部完成。 由于代码中对pool.map()
的每次调用仅启动一个线程,因此您一次只能运行一个线程。
你想要的是:
with Pool() as pool:
pool.map(process_line, f)
这样您的所有线程都作为单个 map 的一部分运行。 或者,如果出于某种原因您想分别启动每个线程,那么
with Pool() as pool:
for i in f:
....
pool.apply_async(process_line, (i,))
我强烈建议使用with Pool()...
确保池在继续之前关闭并加入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.