多进程:
1、每个子进程申请到的资源都是独立的,不与其他进程共享。
2、语法上和线程基本上差不多,使用multiprocessing.Process(target=xxxx,args=(xxx,xxx,xxx,))创建子进程。
3、包含的方法,与线程的也差不多
4、配合os.getpid()方法取得当前进程ID,配合os.getppid()方法取得当前进程的父进程ID 多进程之间的通信:
消息传递:
import queue这个队列模块,是线程queue,只能作用于当前进程,子进程已经不在当前进程中了,所以这个模块就不适用了。 可以使用进程Queue来搞定,进程Queue,q=multiprocessing.Queue(),语法上和线程queue(import queue)差不多的。
使用时,一定要传给子进程运行的函数,线程的queue这个问题还好,但线程queue是无法传递给子进程的,
说白了,进程queue就干进程的事,线程queue就干线程的事,完全不能混用,编写代码必须注意 进程queue原理:进程queue不是共享数据,而是每个进程一个queue,克隆的,还有个不在任何进程内的中间件从A进程来序列化这个queue,
再反序列化这个queue给B进程,来完成数据的传递,这里修改的,不是同一份数据。 还可以使用Pipe管道实现,paraent_pp,child_pp=multiprocessing.Pipe(),会返回一个通道的两端,父进程端,子进程端,没有差异,标识好,
便于写代码时使用,通讯是paraent_pp.send(),对应一个child_pp.recv() 一个发送对应一个回收,底层是socket本机通讯实现的。 数据共享:
以下必须在__name__=="__main__"的情况下运行,也就是作为主进程运行时才可以创建。
mmm= multiprocessing.Manager() # 这个必须是在主进程执行,所以__name__=="__main__"才能使用,
# 共享数据用的对象,
# 可以生成共享的相应对象:
# list, dict, Namespace, Lock, RLock, Semaphore,
# BoundedSemaphore, Condition, Event, Barrier, Queue, Value ,Array
md = mmm.dict() #生成共享字典
ml = mmm.list() #生成共享列表
ml.append("[%s]主进程加的"%os.getpid()) #主进程向共享列表中修改数据
md[os.getpid()]="[%s]主进程加的"%os.getpid() #主进程向共享字典中修改数据 共享资源必须传递给子进程,子进程才可以使用。 进程锁:使用multiprocessing.Lock(),用法和线程锁一致,但是其实实际意义不大,因为进程本来就是资源独立,不存在资源征用,
但是,屏幕是共享的,保证输出完整,用这个锁是ok的 重点:进程池使用multiprocessing.Pool
声明 pool=multiprocessing.Pool(processes=2) #定义一个进程池,每次执行两个进程的进程池
使用:
for i in range(20):
# pool.apply(func=go_process,args=(i,)) #进程池中开始执行进程,这个是串行执行,不支持回调函数
pool.apply_async(func=go_process,args=(i,),callback=go_back) #一般用这个,就是并行执行定义时定义的并行进程个数,支持回调函数
关闭:
pool.close() #先写关闭进程池
pool.join() #再写等待子进程完成,必须这个顺序,原因不明
import multiprocessing #多进程模块
import time,os os.getpid() #获取当前进程的进程ID
os.getppid() #获取当前进程的父进程ID qq=multiprocessing.Queue() #这是个进程queue,语法与线程queue (import queue的那个)是一样的。实现进程间的通信 p_pp,c_pp=multiprocessing.Pipe() #用于进城之间通信的另一个方式,管道,生成了管道的两端,没有区别,父进程一个,子进程一个 def run(dict,llll,pp,qq_func,name):
dict[os.getpid()]="[%s]子进程加的"%os.getpid() #子进程向共享字典中修改数据
llll.append("[%s]子进程加的"%os.getpid()) #子进程向共享列表中修改数据
qq_func.put("队列数据:子进程ID[%s]"%os.getpid()) #子进程向共享队列中修改数据
print("我是子进程,我的进程ID:",os.getpid())
print("那么我的父进程ID是:",os.getppid())
pp.send("这是子进程[%s]通过pipe发过来的信息"%os.getpid()) #子进程向进程通讯管道中发送数据
time.sleep(2)
print("i'm %s"%name) if __name__=="__main__":
p_list=[]
mmm= multiprocessing.Manager() # 这个必须是在主进程执行,所以__name__=="__main__"才能使用,
# 共享数据用的对象,
# 可以生成共享的相应对象:
# list, dict, Namespace, Lock, RLock, Semaphore,
# BoundedSemaphore, Condition, Event, Barrier, Queue, Value ,Array
md = mmm.dict() #生成共享字典
ml = mmm.list() #生成共享列表
ml.append("[%s]主进程加的"%os.getpid()) #主进程向共享列表中修改数据
md[os.getpid()]="[%s]主进程加的"%os.getpid() #主进程向共享字典中修改数据
for i in range(10):
p=multiprocessing.Process(target=run,args=(md,ml,c_pp,qq,"kk[%s]"%i,)) #与多线程语法差不多,这样就生成了进程实例,
p.start() #启动子进程
p_list.append(p) print("我是主进程,我的进程ID:", os.getpid()) for mp in p_list:
mp.join()
print(md) #显示共享字典最终数据
print(ml) #显示共享列表最终数据
i=0
while i<len(p_list):
print(qq.get())
print(p_pp.recv()) #主进程从进程通道中获取数据
i+=1 print(qq.qsize())

进程池:

def go_process(m):  #子进程执行的函数
time.sleep(2)
print("参数:[%s],子进程的pid:%s"%(m,os.getpid())) def go_back(m): #回调函数
print("这是回调函数,参数[%s]执行的进程是:%s"%(m,os.getpid())) if __name__=="__main__":
pool=multiprocessing.Pool(processes=2) #定义一个进程池,每次执行两个进程的进程池 for i in range(20):
# pool.apply(func=go_process,args=(i,)) #进程池中开始执行进程,这个是串行执行,不支持回调函数
pool.apply_async(func=go_process,args=(i,),callback=go_back) #一般用这个,就是并行执行定义时定义的并行进程个数,支持回调函数 pool.close() #先写关闭进程池
pool.join() #再写等待子进程完成,必须这个顺序,原因不明

python3.x Day6 多进程的更多相关文章

  1. python3 多线程和多进程

    一.线程和进程 1.操作系统中,线程是CPU调度和分派的基本单位,线程依存于程序中 2.操作系统中,进程是系统进行资源分配和调度的一个基本单位,一个程序至少有一个进程 3.一个进程由至少一个线程组成, ...

  2. Python3 多线程、多进程

    python中的线程是假线程,不同线程之间的切换是需要耗费资源的,因为需要存储线程的上下文,不断的切换就会耗费资源.. python多线程适合io操作密集型的任务(如socket server 网络并 ...

  3. python3.x Day6 IO多路复用

    IO多路复用import asyncio 这个是异步IO模块 这个还不知道怎么用 select poll epoll 都是IO多路复用 windows 仅支持select linux2.6以后 支持e ...

  4. python3.x Day6 多线程

    线程???进程????区别???何时使用??? 进程:是程序以一个整体的形式暴露给操作系统管理,里边包含了对各种资源的调用,内存的使用,对各种资源的管理的集合,这就叫进程 线程:是操作系统最小的调度单 ...

  5. python3.x Day6 socketserver

    socketserver是啥? 简化了编写网络服务器,就是对于socket的再一次封装sockerserver包含4个类可以使用:A=socketserver.TCPServer() #用于TCP/I ...

  6. python3.x Day6 paramiko

    python3 paramiko模块,用来进行远程操作linux服务器,利用的就是ssh #利用用户名,密码,进行连接 import paramiko #创建一个SSH对象 ssh=paramiko. ...

  7. python3.x Day6 协程

    协程:#定义来自牛人alex博客协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈 ...

  8. python3全栈开发-并发编程,多进程的基本操作

    一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...

  9. Python3.x:实现多任务(多进程)

    Python3.x:实现多任务(多进程) # python3 # author lizm # datetime 2018-02-13 16:00:00 # -*- coding: utf-8 -*- ...

随机推荐

  1. E20180128-hm

    paradigm  n. 范例,样式,模范; 词形变化表; outlet  n. 出口,出路; 批发商店; 排水口,通风口; 发泄(情感)的方法;

  2. bzoj 2839: 集合计数【容斥原理+组合数学】

    首先,考虑容斥,我们所要的答案是并集至少有\( k \)个数的方案数减去并集至少有\( k+1 \)个数的方案数加上并集至少有\( k \)个数的方案数-- 在n个数中选i个的方案数是\( C_{n} ...

  3. Word排版技巧

    点击打开链接 # 整体布局 ## 页面布局 如果是新建一个Word文件,这里「页面布局」一般不用设置了: 文字方向:从左到右: 页边距:普通(日常使用建议用适中或窄,节约用纸,提交的论文报告什么才用普 ...

  4. bzoj2333[SCOI2011]棘手的操作 洛谷P3273 [SCOI2011]棘手的操作

    2333? 先记一下吧,这题现在全部都是照着题解做的,因为怎么改都改不出来,只好对着题解改,以后还要再做过 以后再也不用指针了!太恶心了!空指针可不止直接特判那么简单啊,竟然还要因为空指针写奇怪的分类 ...

  5. Linux单机环境下HDFS伪分布式集群安装操作步骤v1.0

    公司平台的分布式文件系统基于Hadoop HDFS技术构建,为开发人员学习及后续项目中Hadoop HDFS相关操作提供技术参考特编写此文档.本文档描述了Linux单机环境下Hadoop HDFS伪分 ...

  6. 把sed当作命令解释器使用

    [root@sishen ~]# vim script.sed #!/bin/sed -f #交换第一列和第二列 s/\([^,]*\),\([^,]*\),\(.*\).*/\2,\1, \3/g ...

  7. [转]Using the Repository Pattern with ASP.NET MVC and Entity Framework

    本文转自:http://www.codeguru.com/csharp/.net/net_asp/mvc/using-the-repository-pattern-with-asp.net-mvc-a ...

  8. 阿里云服务器 Access to the path '....' is denied.解决方法

    昨天公司项目迁移服务器,从自己服务器迁移到阿里云服务器,部署完成后发现有一个页面要读取磁盘上的静态文件就报错了... 如图: 解决办法: 在 Web.Config 的 <System.Web&g ...

  9. ReactJS-0-React介绍

    React介绍: React是一个库而不是一个MVC框架,因为React只负责解决MVC框架中V(View)层面的问题,React致力于创建可重用的UI组件.(React is a library f ...

  10. SDK manager.exe 运行时报错:系统找不到指定的文件 android.bat

    android studio 2.3.1的 SDK Manager工具 突然没有 Launcher XXX 那个按钮,只好到SDK目录中去启动,无奈发生以下错误. 解决办法:运行android.bat ...