繁体   English   中英

Python multiprocessing.pool,线程池未并行执行 function

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM