首先,进程和线程之间的关系:线程是最小的执行单元,一个进程至少由一个线程组成。
python 实现多进程使用multiprocessing
1、python 的os模块封装的fork()可以轻松创建子进程,但是windows中没有fork调用,所以为了程序的可迁移性就使用multiprocessing啦。
2、multiprocessing启动1个子进程。
def child(name):
print "子进程p %s"%os.getpid()
if __name__ == "__main__":
print "父进程%s"%os.getpid() # 创建子进程p p = Process(target=child,args=('test',)) # 开启子进程 p.start() p.join() ##用于进程之间的同步
3、multiprocessing启动大量子进程,用Pool
from multiprocessing import Pool
import os, time, random
def long_time_task(name):
print('Run task %s (%s)...' % (name, os.getpid()))
if __name__=='__main__':
print('父进程 %s.' % os.getpid())
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print('Waiting for all subprocesses done...')
p.close()
p.join()
结果:
父进程 6420.
Waiting for all subprocesses done...
Run task 0 (4292)...
Run task 1 (4292)...
Run task 2 (4292)...
Run task 3 (4292)...
Run task 4 (4292)...
4、进程之间通信用Queue和Pipes,下面是Queue
import multiprocessing
from multiprocessing import Queue,Process
import os, time,random
def write(q):
print 'process to write %s'%(os.getpid())
for value in ['a','b','c']:
print 'put %s to queue'%(value)
q.put(value)
time.sleep(random.random())
def reade(q):
print 'process to reade %s' % (os.getpid())
while True:
value = q.get(True)
print 'get %s from queue'% value
if __name__=='__main__':
# 父进程创建queue
q = Queue()
# 子进程1
pw = Process(target=write,args=(q,))
# 子进程2
pr = Process(target=reade,args=(q,))
pw.start()
pr.start()
pw.join()
pr.join()
pr.terminate()
结果:
process to write 11076
put a to queue
process to reade 1128
get a from queue
put b to queue
get b from queue
put c to queue
get c from queue
总之就是,实现多进程就用multiprocessing,可以创建单独的子进程,也可用pool创建大量的子进程,用Queue和Pipes实现进程之间的通信