------------------
一、多进程
线程是最小的执行单元,而进程由至少一个线程组成。
python中os模块中的fork()可以复制当前进程,并且子进程返回0,父进程返回子进程的PID。那么子进程可以用getppid()得到父进程的PID :
# multiprocessing.py import os print ‘Process (%s) start...‘ % os.getpid() pid = os.fork() #windows系统下没有fork()调用,so,只能在posix的系统下执行(Unix,Linux,Mac,BSD...) if pid==0: print ‘I am child process (%s) and my parent is %s.‘ % (os.getpid(), os.getppid()) else: print ‘I (%s) just created a child process (%s).‘ % (os.getpid(), pid)
Process (876) start... I (876) just created a child process (877). I am child process (877) and my parent is 876.
常见的Apache服务就是由父进程监听端口,然后fork()出子进程来处理http请求.
1、multiprocessing:提供跨平台的多进程支持
Python中有multiprocessing模块提供跨平台的多进程支持:
from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): print ‘Run child process %s (%s)...‘ % (name, os.getpid()) if __name__==‘__main__‘: print ‘Parent process %s.‘ % os.getpid() p = Process(target=run_proc, args=(‘test‘,)) print ‘Process will start.‘ p.start() #启动进程 p.join() #等待子进程结束后再继续往下运行,通常用于进程间的同步。 print ‘Process end.‘
2、Pool :进程池.
要启动大量的子进程,可以用进程池的方式批量创建子进程:
from multiprocessing import Pool import os, time, random def long_time_task(name): print ‘Run task %s (%s)...‘ % (name,os.getpid()) start = time.time() time.sleep(random.random() * 3) #随机暂停 end = time.time() print ‘Task %s runs %0.2f seconds.‘ % (name,(end-start)) if __name__==‘__main__‘: print ‘Parent process %s.‘ % os.getpid() p = Pool() #创建一个进程池. for i in range(5): p.apply_async(long_time_task,args=(i,)) #将要执行的函数加入进程池 print ‘Waiting for all subprocesses done....‘ p.close() p.join() #等待所有子进程执行完毕,之前必须先调用close(),然后不能添加新的Process. print ‘All subprocessesdone.‘
Parent process 1356. Waiting for all subprocesses done.... Run task 3 (6296)... Task 3 runs 0.52 seconds. Run task 2 (4244)... Task 2 runs 1.58 seconds. Run task 0 (5720)... Task 0 runs 1.48 seconds. Run task 1 (7692)... Task 1 runs 2.55 seconds. Run task 4 (1860)... Task 4 runs 2.96 seconds. All subprocessesdone. [Finished in 3.3s]
Pool
的默认大小是CPU的核数,当然,你也可以改变:
p = Pool(5)
3、进程间通信:
multiprocessing
模块包装了底层的机制,提供了Queue
、Pipes
等多种方式来交换数据,以Queue为例:参考:这里
from multiprocessing import Process,Queue import os, time, random #写数据进程执行的代码: def write(q): for value in [‘A‘,‘B‘,‘C‘]: print ‘Put %s to queue...‘ % value q.put(value) time.sleep(random.random()) #读数据进程执行的代码: def read(q): while True: if q.empty(): return else: value = q.get() print value,‘from Queue‘ if __name__==‘__main__‘: #父进程创建Queue,并传给各个子进程: q = Queue() pw = Process(target=write,args=(q,)) pr = Process(target=read,args=(q,)) #启动子进程pw,写入: pw.start() #启动子进程pr,读取: pr.start() #等待pw,pr结束: pw.join() pr.terminate()
sdf
原文:http://www.cnblogs.com/xccnblogs/p/4926303.html