Python 多进程 multiprocessing

本文从WordPress迁移而来, 查看全部WordPress迁移文章

一个需求,给了4000万条URL,如果一条条来处理,太久了。于是把文件分块,每个文件有100万URL,要处理100万条URL还是很快的。

写了两个版本,第二版本要 快得多,因为不用进程通信,写第一版本只是为了学习python进程通信而写的

版本1:父进程创建一个锁和进程间通信的队列(作用跟消息队列一样,姑且认为是消息队列),子进程生成数据后,争夺锁,将消息put进消息队列,父进程一直在消息队列中等着取消息,父进程取完消息后,就将其写入文件

版本2:根本不用把消息给会父进程,子进程生成消息后,争夺锁,自己写入文件

记录一下API以及使用时遇上的症状,用了哪些记录哪些

1
import multiprocessing

创建进程:

1
pro = multiprocessing.Process(target=worker, args=(pro_id, xxx, yyy))

常用参数:target,args,target执行子进程入口的函数,args是传给入口函数的参数

进程启动,父进程等待子进程结束:

1
2
pro.start()
pro.join()

创建锁,争夺锁,释放锁:

1
2
3
lock = multiprocessing.Lock()
lock.acquire()
lock.release()

创建消息队列, 放数据,取数据:

1
2
3
que = multiprocessing.Queue()
que.put(data)
que.get(block=True, timeout=10)

get函数可以设置是否阻塞以及阻塞的话的超时时间

假的进程?

遇到一个症状,父进程无法退出吗。

如果子进程还没运行完,就算父进程运行完了,它也无法退出,这跟我们对于linux进程的传统印象不一样

linux进程,父进程爱退出退出,父进程退出后,1号进程会接管那些孤儿进程,成为它们的父进程;而在python进程这里,父进程似乎必须等待子进程退出了自己才能退出

设置子进程的daemon属性:

将所有子进程的daemon属性都设置为True之后(默认是False), pro.daemon = True; 就发生了父进程应该退出的时候退出了,但是子进程跟着都退出了,这还是不符合传统linux进程的状况

这时候回忆起曾经用过的python多线程,也有daemon属性,也是相同的功能,所以其实python的multiprocessing是个假的多进程?到底是怎么实现的,有待考究

而os库是有fork()函数的,没用过,事后试一下,或许这个os.fork()才是我们熟悉的linux多进程