使用工作池编写文件

时间:2014-04-15 10:53:00

标签: python multithreading python-3.x

我必须编写一些相当大的文件,我想在一个单独的线程中执行此操作(同时使用处理器和HDD)并且我想使用大小为4的工作池(因为除了写作之外还有其他操作,我认为4足以正确使用硬盘而不会堵塞它。)

这是我的代码(它什么都不做):

import os, os.path, multiprocessing

def asyncFileMake(e):
    with open('files/file%d.txt'%e, 'w') as f:
        print(os.path.dirname(os.path.abspath(os.getcwd())))
        f.write("hi")

def writefile(e, pool):
    pool.apply_async(asyncFileMake, [e])

if __name__ == "__main__":
    if not os.path.exists('files'):
        os.makedirs('files')
    with multiprocessing.Pool(processes=4) as pool:
        for e in range(10):
          writefile(e, pool)

1 个答案:

答案 0 :(得分:3)

这是一个受原始代码段启发的版本。我认为最重要的变化是函数传递到池的方式(map而不是apply_async,稍后会更多):

import os
import multiprocessing

def create_file(e):
    with open('files/file%d.txt'%e, 'w') as f:
        print f.name
        f.write("hi")

if __name__ == '__main__':
    if not os.path.exists('files'):
            os.makedirs('files')
    pool = multiprocessing.Pool(processes=4)
    pool.map(create_file, range(10))

原始实现的问题是,pool.apply_async返回AsyncResult,您需要在其上调用get,以便触发实际执行。我建议你仔细看看documentation of multiprocessing。特别是this part about pool workers。希望有所帮助。