一、多进程

from multiprocessing import Process
import osdef func1(num):print(num)if __name__ == '__main__':print('主进程id为:', os.getpid()) #获取主进程idfor i in range(10):p = Process(target=func1,args=(i,)) #创建子进程p.start() #调起子进程print('子进程名称为:', p.name)  #获取子进程名称print('子进程id为', p.pid)  #获取子进程id

二、同时运行多进程时,每个进程默认都拥有一份独立的数据;通过全局变量并不能实现进程间的数据通信

a = 1
def func2():global aa +=1print('子进程中的a:', a)  #子进程中的a: 2
if __name__ == '__main__':p = Process(target=func2)p.start()p.join()print('主进程中的a:', a) #主进程中的a: 1

三、进程间数据通信

1、借助Queue、pipe等进行通信

from multiprocessing import Process, Queue
import os, time, randomdef write_queue(q):   #写数据到队列for value in range(10):print('Put %s to queue...'%value)q.put(value)time.sleep(2) #每隔2秒写入数据def read_queue(q):    #从队列读取数据while True:value = q.get(True)print('Get %s from queue.' %value)time.sleep(3) #每隔3秒读取数据if q.empty(): #若队列为空,退出循环print('队列为空,请输入数据后再读')breakif __name__=='__main__':q = Queue()    #父进程创建Queue,传给子进程pw = Process(target=write_queue, args=(q,))pr = Process(target=read_queue, args=(q,))start = time.time()pw.start()     #启动子进程pw,写数据pr.start()     #启动子进程pr,读数据
    pw.join()end_pw = time.time()run_pw = end_pw - start #计算写数据的时间pr.join()               #terminate()可强行终止进程end_pr = time.time()run_pr = end_pr - start #计算读数据的时间print('写数据花费时间:', run_pw, '读数据花费时间', run_pr)

2、借助Manager实现进程间的数据通信;Manager支持的类型非常多,包括: Value,Array,list, dict,Queue, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event等

from multiprocessing import Process, Manager
import timedef func(p_dict, p_list): #入参:p_dict为字典,p_list为listfor i in range(10):time.sleep(2)k = str(i) + '*' + str(i)p_dict[k] = i * ifor i in range(10):time.sleep(1)p_list.append(i)if __name__ == "__main__":manager = Manager()dt = manager.dict() #创建dict实例lt = manager.list() #创建list实例start = time.time()p = Process(target=func, args=(dt, lt))p.start()p.join()end = time.time()run_time = end - startprint(dt, '\n', lt)print('运行时间为:',run_time) #运行时间大约为30s

四、进程池

1、通过apply_async()可批量创建子进程

2、从进程池获取进程时,先判断进程池是否已满;若进程池满了,则需要等待进程池重新有空余的进程(池中其他被调用的子进程结束),再继续

from multiprocessing import Pool
import time
def func2(num):time.sleep(2)print(num)
if __name__ == '__main__':start = time.time()pool = Pool(5)  #创建进程池,最多可同时运行5个子进程for i in range(5):pool.apply_async(func=func2,args=(i,)) #apply_async()调用子进程print('执行主程序')pool.close()pool.join()    #等待子进程结束再结束主进程end = time.time()run_time = end - startprint(run_time)

run_time的时间取决于进程池的个数pool = Pool(N):

1)当N=2时,每次只能从进程池取2个子进程,5个子进程要分三次调用:run_time = 2 + 2 + 2

2)当N=3时,每次只能从进城池取3个子进程,5个子进程要分2次调用:run_time = 2 + 2

3)当N>=5时,可同时调用5个子进程:run_time = 2

转载于:https://www.cnblogs.com/jessicaxu/p/8005256.html

Python-多进程相关推荐

  1. python多进程详解

    目录 python多进程 序.multiprocessing 一.Process process介绍 例1.1:创建函数并将其作为单个进程 例1.2:创建函数并将其作为多个进程 例1.3:将进程定义为 ...

  2. Python 多进程开发与多线程开发

    我们先来了解什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...

  3. python多进程_python语法:多进程

    之前在一篇文章中写过,有关于Python线程的问题: 是枝裕和:内:用python多线程同时处理大量文件​zhuanlan.zhihu.com 当然我的写的文章都是面对于一些初学者和python代码实 ...

  4. 取代Python多进程!伯克利开源分布式框架Ray

    Ray由伯克利开源,是一个用于并行计算和分布式Python开发的开源项目.本文将介绍如何使用Ray轻松构建可从笔记本电脑扩展到大型集群的应用程序. 并行和分布式计算是现代应用程序的主要内容.我们需要利 ...

  5. python 多进程_说说Python多线程与多进程的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  6. python多进程存储数据_Python 多进程及进程间通信

    python 因 GIL 的存在,处理计算密集型的任务时无法高效利用多核 CPU 的计算资源,这时就需要使用多进程来提高对 CPU 的资源利用.Python 多进程主要用 multiprocessin ...

  7. python 多进程异常处理

    前言 最近项目用到了Python作为网站的前端,使用的框架是基于线程池的Cherrypy,但是前端依然有一些比较'重'的模块.由于python的多线程无法很好的利用多核的性质,所以觉得把这些比较'重' ...

  8. python多进程断点续传分片下载器

    python多进程断点续传分片下载器 标签:python 下载器 多进程 因为爬虫要用到下载器,但是直接用urllib下载很慢,所以找了很久终于找到一个让我欣喜的下载器.他能够断点续传分片下载,极大提 ...

  9. Python 多进程、多线程启动

    本文仅供学习交流使用,如侵立删!demo下载见文末 Python 多进程启动 def main(self, num):"""多进程启动ValueError: Pool n ...

  10. Python 多进程的进程池pool运行时报错:ValueError: Pool not running

    本文仅供学习交流使用,如侵立删!demo下载见文末 Python 多进程的进程池pool运行时报错:ValueError: Pool not running def main(self, num):& ...

最新文章

  1. PHP是弱类型语言,自动转换,强制转换
  2. 【Linux】18.设置静态ip的方法(Ubuntu系统、nas、Red-Hat系统)
  3. java基础提升篇:Java中Native关键字的作用
  4. 数据结构+算法 学习计划与资源
  5. 桔子浏览器电脑版如何登录 桔子浏览器PC版账号登录教程
  6. Nagios 监控系统架构
  7. Vue的babel-plugin-transform-remove-console依赖使用方法
  8. 谈谈制作台历的心得——年初企业们比较喜欢的宣传方式
  9. java8编程入门 pdf_Java8编程入门官方教程(第6版).pdf
  10. java项目(一) ——家庭收支记账系统
  11. 对 a = [lambda : x for x in range(3)] 的理解
  12. light动名词_动名词的用法英语语法大全
  13. 人类的社会制度:封建制度(封建社会)
  14. 算法程序-通过log重现计算过程
  15. ReferenceError: “alert” is not defined
  16. windows下UHD安装教程
  17. Confluence使用教程-不古出品
  18. Oracle 恢复删除数据
  19. 【AGC012E】 Camel and Oases ST表+状压dp
  20. 超超超超超详细的数据库课设报告-学生公寓管理系统

热门文章

  1. SAP CRM订单状态下拉菜单字段里的值是怎么配出来的
  2. Docker container与宿主进程相互隔离的实现原理
  3. 专家系统出现的计算机应用阶段,接本第一二章历年考题08-12
  4. 用js监控分辨率调整背景图片宽度_如何使用CSS Paint API动态创建与分辨率无关的可变背景
  5. 在python中查看关键字、需要执行_python关键字以及含义,用法
  6. eclipse没有dynamic web project_Microsoft Teams迎来Project与Roadmap功能集成
  7. 学计算机的管理医生,计算机科学与技术系医学生管理工作体会.pdf
  8. 他们和机器人啪啪啪,并计划共度一生
  9. 建一个电赛交流群-大鱼机器人公众号专属
  10. struts2 jsp跳转action 404_Struts2 学习笔记(三)