多进程:
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. MongoDB安全事件的防范与反思

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 近段时间来,全球范围内数以万计的MongoDB实例被攻击,作为旨在为用户提供最优MongoDB云服务的网易蜂 ...

  2. bzoj 1565 [NOI2009]植物大战僵尸【tarjan+最大权闭合子图】

    一上来以为是裸的最大权闭合子图,上来就dinic -然后没过样例.不得不说样例还是非常良心的给了一个强连通分量,要不然就WA的生活不能自理了 然后注意到有一种特殊情况:每个植物向他保护的植物连边(包括 ...

  3. bzoj 3144 [Hnoi2013]切糕【最小割+dinic】

    都说了是'切'糕所以是最小割咯 建图: 每个点向下一层连容量为这个点的val的边,S向第一层连容量为inf的边,最后一层向T连容量为自身val的边,即割断这条边相当于\( f(i,j) \)选择了当前 ...

  4. Microsoft函数调用约定

    Microsoft函数调用约定 对于所有调用共有的约定:ebx.ebp.esi.edi都是calle-save,即由被调用的函数负责它们的保存(如果被调用函数用到了这些寄存器的话) 先看函数调用发生了 ...

  5. 扩展KMP的应用

    扩展KMP的应用: 给出模板串S和串T,长度分别为Slen和Tlen,要求在线性时间内,对于每个S[i](0<=i<Slen),求出S[i..Slen-1]与T的 最长公共前缀长度,记为e ...

  6. Android插件开发

    插件开发的概念: 对于一个功能特别多,代码量特别大的App比如支付宝.360手机助手来说,如果把所有的功能和代码都写在一个App中,就会造成App体积过于庞大,用户下载体验差,不方便测试,业务.模块耦 ...

  7. ABBYY Cup 3.0 - Finals (online version)

    A 开个数组记录一下 #include <iostream> #include<cstdio> #include<cstring> #include<algo ...

  8. Jquery插件jqprint-0.3.js实现打印

    1.首先引用Jquery和jqprint-0.3.js(依赖于Jquery的) <script language="javascript" src="jquery- ...

  9. WindowForm.计算器

    设计计算器: 外部变量: 数字键按钮: 运算符按钮事件代码: 清零按钮 等号按钮: 思维导图:

  10. Windows API函数大全一

    1. API之网络函数             WNetAddConnection 创建同一个网络资源的永久性连接             WNetAddConnection2 创建同一个网络资源的连 ...