多进程:
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. Excel学习 -- 数据透视表功能

    Excel -- 数据透视表基础 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等.所进行的计算与数据跟数据透视表中的排列有关.    之所以称为数据透视表,是因 ...

  2. IIS重新注册

    打开程序-运行-cmd:输入一下命令重新注册IISC:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

  3. Luogu P1073 最优贸易【最短路/建反图】 By cellur925

    题目传送门 这么经典的题目,还是看了lyd的题解....唉难过. 一句话题意:在一张点有全都的图上找一条从1到n的路径,存在两个点p,q(p<q),使val[q]-val[p]最大. 给出的图是 ...

  4. js实现打字效果

    <!DOCTYPE html> <html> <head> <meta charset='utf-8'> <title>js typing& ...

  5. #undef及其用法

    简    介 在后面取消以前定义的宏定义 在此程序中,我们将取消在先前程序中对预处理器的定义. #include <stdio.h> int main( void ) { #define ...

  6. C#模版学习研究

    原文链接1   原文链接2 using System; using System.Collections.Generic; using System.Text; using T = System.By ...

  7. 对char类型的数组进行冒泡排序

    package maopaopaixu; import java.util.Arrays; import java.util.Scanner; public class Demo02 { public ...

  8. Java 208道面试题及部分答案

    ---恢复内容开始--- 一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件 ...

  9. 深入学习数据结构之bitmap(四)

    Bitmap,今天我们来分析一下bitmap的实现原理以及它的使用场景. 一.使用场景: 1.对于大量数据(几千个数据的就不要在废话了),且无重复或者可以忽略重复的数字.为啥这里要强调无重复,因为在b ...

  10. 维控PLC与电流变送器modbus通讯获取电流变送器数据

    2018-09-2319:28:01 今天本来要用单片机来做这个项目的,但是失败了.... 所以我又拿出了PLC来搞,也是相当之复杂,查了很多资料终于做出而来了. 今天还有事,赶紧临时备份总结一波