做任何工作之前,多处理都会退出

时间:2019-11-12 15:41:41

标签: python python-3.x parallel-processing multiprocessing threadpool

我继承了一个解析器,该解析器应该解析10个文件,每个文件约有4m行。

代码是用我更新的Python 2编写的。

有一个多处理逻辑,我似乎无法上班。

from multiprocessing.pool import ThreadPool
import glob

DATADIR = 'home/my_dir/where/all/my/files/are'

def process_file(filepath):
    # read line by line, parse and insert to postgres database. 

def process_directory(dirpath):
    pattern = f'{dirpath}/*dat'  # files have .dat extension. 
    tp = ThreadPool(10)
    for filepath in glob.glob(pattern):
        print(filepath)
        tp.apply_async(process_file, filepath)
    tp.close()
    tp.join()

if __name__ == '__main__':
    process_directory(DATADIR)

我已经阅读了很多文档和一些类似的问题,但是似乎不起作用。

使用解析器代码,发生的事情是我确实将需要解析的文件的所有路径打印在控制台上,但这就是程序没有执行任何其他操作。

1 个答案:

答案 0 :(得分:2)

问题出在您致电apply_async的方式上。我对您的问题做了一个简单的复制,但是稍作调整就可以从每次调用中得到结果:

from multiprocessing.pool import ThreadPool

def func(f):
    print("hey " + f)
    return f + "1"

l = ["name", "name2", "name3"]
pool = ThreadPool(3)
out = []
for a in l:
    print(a)
    out.append(pool.apply_async(func, a))

# Check the response from each `apply_async` call
for a in out:
    a.get()

pool.close()
pool.join()

这将返回错误:

Traceback (most recent call last):
  File "a.py", line 16, in <module>
    a.get()
  File "/usr/lib64/python3.4/multiprocessing/pool.py", line 599, in get
    raise self._value
  File "/usr/lib64/python3.4/multiprocessing/pool.py", line 119, in worker
    result = (True, func(*args, **kwds))
TypeError: func() takes 1 positional argument but 4 were given

它认为您正在传递四个位置参数,而不是一个。这是因为apply_async希望在元组中传递所有参数,如下所示:

pool.apply_async(func, (a,))

如果您在调用filepath时将apply_async放在一个元组中,我想您会得到预期的行为。

还值得注意的是,您的用例非常适合使用pool.map而不是apply_async,这更加简洁:

pool.map(process_file, glob.glob(pattern))