Python--多进程
2016-01-25 10:30
886 查看
1.multiprocessing.Pool()方法
2.fork()方法
#摘自廖雪峰的官方网站
Unix/Linux系统下,fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。
由于Windows没有fork调用,上面的代码在Windows上无法运行。由于Mac系统是基于BSD(Unix的一种)内核,所以,在Mac下运行是没有问题的,
有了fork调用,一个进程在接到新任务时就可以复制出一个子进程来处理新任务,常见的Apache服务器就是由父进程监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求。
3.multiprocessing.Process()
multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:
join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
4.进程间通信
Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。
eg:在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:
运行结果如下:
Put A to queue…
Get A from queue.
Put B to queue…
Get B from queue.
Put C to queue…
Get C from queue.
#用进程池的方式批量创建子进程: import multiprocessing #创建进程池 pool_num=4 #若不指定线程数量,默认为机器的cpu核数 pool=multiprocessing.Poll(pool_num) #将map放入不同进程 pool.map(function,list) #关闭进程池 pool.close() #对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了 pool.join()
2.fork()方法
#摘自廖雪峰的官方网站
Unix/Linux系统下,fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。
由于Windows没有fork调用,上面的代码在Windows上无法运行。由于Mac系统是基于BSD(Unix的一种)内核,所以,在Mac下运行是没有问题的,
有了fork调用,一个进程在接到新任务时就可以复制出一个子进程来处理新任务,常见的Apache服务器就是由父进程监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求。
# multiprocessing.py import os print 'Process (%s) start...' % os.getpid() pid = os.fork() 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.
3.multiprocessing.Process()
multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:
join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
from multiprocessing import Process import os import time def run_proc(name): print 'Run child process %s (%s)...' % (name, os.getpid()) time.sleep(3) if __name__=='__main__': print 'Parent process %s.' % os.getpid() p = Process(target=run_proc, args=('test',)) print 'Process will start.' #因子进程设置了daemon属性,主进程结束,它们就随着结束了。 p.daemon=True p.start() p.join() print 'Process end.' #执行结果如下: Parent process 928. Process will start. Run child process test (929)... #此等待3s Process end.
4.进程间通信
Python的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。
eg:在父进程中创建两个子进程,一个往Queue里写数据,一个从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: 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,写入: pw.start() # 启动子进程pr,读取: pr.start() # 等待pw结束: pw.join() # pr进程里是死循环,无法等待其结束,只能强行终止: pr.terminate()
运行结果如下:
Put A to queue…
Get A from queue.
Put B to queue…
Get B from queue.
Put C to queue…
Get C from queue.
相关文章推荐
- python废话四:python的import引入模块
- python 帮助和导入路径
- 谈谈Python进行验证码识别的一些想法
- Python网站验证码识别
- Python中变量的作用域(variable scope)
- 基于Python Shell获取hostname和fqdn释疑
- python-dict
- 将Sublime Text 3设置为Python全栈开发环境
- 12306的变态验证码算得了什么?我有Python神器!
- Python 初学者的最佳学习资源
- Python爬虫实战(4):抓取淘宝MM照片
- python废话三:变量:局部变量和全局变量
- python --闭包学习
- 使SourceInsight支持Python语言的方法
- python废话二:学习python2还是python3
- 21行Python代码实现拼写检查器
- Python--(高阶)函数
- Python Unit Testing
- Python Unit Testing
- 44. Wildcard Matching leetcode Python 2016 new season