为了避免进程之间资源抢用的问题,并行将数据写入文件时,可能会导致文件内容混乱.
最直接的方式是,给文件加锁,但多进程时,加锁的效果和单进程就没多大区别了.
另一种思路是,将各个进程要写入文件的内容作为返回值返回到一个给定回调函数,由回调函数将内容写入文件.
还有一种更优雅的方式是,采用 multiprocessing 库的回调函数来实现. 如:
apply_async(func[, args[, kwds[, callback[, error_callback]]]])
map_async(func, iterable[, chunksize[, callback[, error_callback]]])
应用场景:
进程池中任何一个任务一旦处理完了,就立即告知主进程:任务已经好了,可以处理其结果了。主进程则调用一个函数去处理该结果,该函数即回调函数。可以把耗时间(阻塞)的任务放到进程池中,然后指定回调函数(主进程负责执行),这样主进程在执行回调函数时就省去了I/O的过程,直接拿到的是任务的结果。
示例如:
import multiprocessing
# 设置回调函数
def setcallback(x):
with open('result.txt', 'a+') as f:
line = str(x) + "\n"
f.write(line)
def multiplication(num):
return num*(num+1)
if __name__ == '__main__':
pool = multiprocessing.Pool(6)
for i in range(1000):
pool.apply_async(func=multiplication, args=(i,), callback=setcallback)
pool.close()
pool.join()