python 多进程

#coding:utf-8
#要让Python程序实现多进程(multiprocessing)
#Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。
#普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统
#自动把当前进程(父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回
#子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程
#所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID

import os

#打印出当前进程的进程ID
print 'Process(%s) start...' % os.getpid()
#创建一个子进程,process会有两个返回值
#当process为0时为子进程
process = os.fork()

if process == 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)

 

multiprocessing的使用

#coding:utf-8
#multiprocessing模块就是跨平台版本的多进程模块
#multiprocessing模块提供了一个Process类来代表一个进程对象
from multiprocessing import Process
import os

#子进程要执行的代码
def run_proc(name):

print 'Run child process %s (%s)...' % (name, os.getpid())

#创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例
#join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步

if __name__ == '__main__':

#输出主线程的id
print 'Parent process %s' % os.getpid()
#创建一个Process实例
p = Process(target = run_proc,args = ('test',))

print 'Process will start'

p.start()

#子进程会阻塞主线程
p.join()

print 'Process end'

 

进程池的使用

 

#coding:utf-8
#进程池
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()

#对Pool对象调用join()方法会等待所有子进程执行完毕
#调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process
p = Pool()

for i in range(5):

p.apply_async(long_time_task,args =(i,))

print 'Waiting for all subprocess done ..'

p.close()

p.join()

print 'All subprocess done'

 

进程之间进行通信 

#coding:utf-8

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:
#从队列中获取元素
value = q.get(True)
print 'Get %s from queue' % value


if __name__ == '__main__':

#父进程创建Queue,并传递给各个子进程
q = Queue()

#创建一个写入子进程对象
pw = Process(target=write,args = (q,))
#创建一个读子进程对象
pr = Process(target=read,args = (q,))

pw.start()

pr.start()

#等待pw结束
pw.join()

#pr进程里是死循环,无法等待其结果,只能强行终止

pr.terminate()

 

posted on 2018-01-18 11:56  paulversion  阅读(125)  评论(0编辑  收藏  举报