多进程+进程池

多进程(不同进程不可直接访问数据)

引入(多进程套线程)

多进程 需导入multiprocessing模块

模板示例1

import threading,time,multiprocessing
def run(name):
time.sleep(2)
print('hi',name)
def running(n):
time.sleep(2)
print('ok',n,threading.get_ident())
t=threading.Thread(target=run,args=(n,))
t.start()
if __name__ == '__main__':
start=time.time()
t=[]
for i in range(10):
m=multiprocessing.Process(target=running,args=('cf%s'%i,))
m.start()
t.append(m)
for i in t:
i.join()
print(time.time()-start)

注意:

1threading.get_ident()得到当前线程号

2multiprocessing的实例化与函数用法大致与线程threading相同

3if __name__ == '__main__':类似于其它语言的main函数

模板示例2

import time,multiprocessing,os
def a(title):
print(title)
print('module_name',__name__)
print('父进程:',os.getppid())
print('当前进程',os.getpid())
print('\n')
def b(name):
print(name)
a('\033[31;1mhello it\'s me\033[0m')
if __name__=='__main__':
a('\033[32;1mhello it\'s me\033[0m')
m=multiprocessing.Process(target=b,args=('ok',))
m.start()

注意:

1 '\033[31;lm字符串\033[0m'颜色输入

2 此程序导入了os包 使用其中os.getpid()代表取到当前进程名 os.getppid()函数 代表取到当前进程的父进程名

======================================================================

1.Queue模块

queue和Queue区别:

①queue是线程间数据共享 用在threading线程中直接使用访问

②Queue是进程间数据传递 用在multiprocessing多进程中(两份数据 经过pickle编码 实现数据一致)

from multiprocessing import Process,Queue
def f(qq):
qq.put([1,'','sdad'])
if __name__=='__main__':
q=Queue()
p=Process(target=f,args=(q,))
p.start()
print(q.get())
p.join()

注意:

1from multiprocessing import Process,Queue  从多进程模块中导入Queue模块

2实例化 q=Queue()  后可作为参数传递入其他进程

3Queue(用于进程)与queue(用于线程)一样 put函数可塞入各种类型的数据

=========================================================================

2.Pipe模块

①用作进程间的数据传递(两份数据 经过pickle编码 实现数据一致)

示例

from multiprocessing import Process,Pipe
def f(n):
print(n.recv())
n.send("it's me")
if __name__=='__main__':
A,B=Pipe()
m=Process(target=f,args=(B,))
m.start()
A.send("hello")
print(A.recv())

注意:

1 Pipe模块也是从多进程模块中载入

2 A,B=Pipe() 实例化 Pipe后 得到两个值 分别代表要连接的两个进程

3 两进程间靠send与recv相互传递类似于socket用法

======================================================================

3.Manager模板

①利用manager实现数据的共享 做到多个进程修改同一个数据
from multiprocessing import Process,Manager
import os
def f(d,k):
d[os.getpid()]=os.getpid()
k.append(os.getpid())
print(k) if __name__=='__main__':
m=Manager()
d=m.dict() #生成一个字典可在多个进程间共享和传递
k=m.list() #生成一个列表可在多个进程间共享和传递
li=[]
for i in range(10):
p = Process(target=f, args=(d, k))
p.start()
li.append(p)
for n in li:
n.join() print(d)
print(k)

注意:

1 Manager亦是从多线程模板导入

2 m=Manager() 实例化得到一个返回值 以此可创建不同的字典.dict()与列表.list()  [只有在Manager中才可对实例化对象创造字典与列表]

3 字典加数据 直接d[key]=value

进程池pool

from multiprocessing import Process,Pool    #导入进程池模块
import time,os
def f(i):
time.sleep(2)
print(i)
return i+1000
def g(arg):
print("in end -%s"%os.getpid(),arg)
if __name__=='__main__':
pool=Pool(processes=3) #允许进程同时放入3个进程(其余线程等待)
print('主线程',os.getpid())
for i in range(10):
#pool.apply(func=f,args=(i,)) #apply调用串行函数
#pool.apply_async(func=f,args=(i,))#apply_async调用并行
pool.apply_async(func=f,args=(i,),callback=g) #最后增加callback实现 在前函数调用结束后再调用的函数 会传入参数(参数是前函数的返回值)
print('end ---')
pool.close() #进程池 必须要先调用close关闭 在调用join函数
pool.join()

注意:

1 from multiprocessing import Process,Pool    #导入进程池pool模块

2 pool=Pool(processes=3)   以此种方式实例化进程池 参数为同时放入的最大进程数

3 有两种调用函数 pool.apply(func=f,args=(i,))       此为串行(一个进程结束后 另一进程继续)

        pool.apply_async(func=f,args=(i,))    此为并行(同时进行)

4  pool.apply_async(func=f,args=(i,),callback=g)   最后增加callback实现 在前函数func调用结束后再调用函数 会传入参数(参数是前函数的返回值)

5 进程池必须先close关闭 再调用join函数

    -----若先调用join会报错

    -----只调用close会结束主进程后退出 不会执行完其他进程

#queue和Queue区别(不同进程不可直接访问数据)
#queue是线程间数据共享 用在threading线程中直接使用访问
#Queue是进程间数据传递 用在multiprocessing多进程中(两份数据 经过pickle编码 实现数据一致)

day12学python 多进程+进程池的更多相关文章

  1. Python多进程-进程池

    进程池可以减轻多进程对CPU的负担 把一个进程序列放入进程池,使用的时候,就会在进程池中取进程如果进程池中没有进程了,脚本就会等待,直到进程池中有可用进程 进程池生成的子线程,不能直接运行,要放入进程 ...

  2. Python 多进程进程池Queue进程通信

    from multiprocessing import Pool,Manager import time def hanshu(queue,a): n = 1 while n<50: # pri ...

  3. python使用进程池多进程时,如何打印错误信息

    一.说明 1.python进程池进行多进程运行时,如果有错误,该进程会直接跳过,并且不会打印错误信息. 2.如果需要了解到进程内的错误信息,此时就需要通过捕获异常来输出错误信息了. 二.具体方法如下: ...

  4. 网络编程并发 多进程 进程池,互斥锁,信号量,IO模型

    进程:程序正在执行的过程,就是一个正在执行的任务,而负责执行任务的就是cpu 操作系统:操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 操作系统的作用: 1:隐藏丑陋复杂的硬件接 ...

  5. python多进程并发进程池Pool

    简介: python中的多进程主要使用到 multiprocessing 这个库.低版本python这个库在使用 multiprocessing.Manager().Queue时会出问题,建议大家升级 ...

  6. python 36 进程池、线程池

    目录 1. 死锁与递归锁 2. 信号量Semaphor 3. GIL全局解释器锁:(Cpython) 4. IO.计算密集型对比 4.1 计算密集型: 4.2 IO密集型 5. GIL与Lock锁的区 ...

  7. python中进程池和回调函数

    一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...

  8. python3多进程 进程池 协程并发

    一.进程           我们电脑的应用程序,都是进程,进程是资源分配的单位.进程切换需要的资源最大,效率低.         进程之间相互独立         cpu密集的时候适合用多进程 #多 ...

  9. python之进程池与线程池

    一.进程池与线程池介绍 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时就应该 ...

随机推荐

  1. Linux实战教学笔记48:openvpn架构实施方案(一)跨机房异地灾备

    第一章VPN介绍 1.1 VPN概述 VPN(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业之间或者 ...

  2. Android开发实战之底部Dialog弹出效果

    在Android开发中,有很多情况下我们需要使用到对话框,遗憾的是,安卓自带的对话框样式不能满足我们实际的需要,所以往往需要我们自定义对话框,具体做法:写一个对话框继承自Dialog实现他的一个构造方 ...

  3. react-native init安装指定版本的react-native

    C:\Users\ZHONGZHENHUA\imooc_gp\index.js index.js /** @format */ import React,{ Component } from 'rea ...

  4. 浅谈利用PLSQL的多线程处理机制,加快处理大数据表的效率

    我们在处理大数据表的时候经常会感觉的处理速度不够快,效率不够高,那么今天下面我就来简单实现下PLSQL的多线程编程处理数据: 我模拟一个简单的场景,把某一张表中的数据(当然这张表的数据非常大)同步到目 ...

  5. office excel 2010 破解版下载地址

    office excel 2010 破解版下载地址  http://www.xitongzhijia.net/soft/24189.html

  6. 对JS中函数的理解

    函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...

  7. windows7配置git 免密码登录git服务器

    1.在桌面右击“Git Bash Here ” 2.输入:cd ~/.ssh/ 3.输入你的git服务器的用户 git config --global user.name "xx" ...

  8. springboot+mongonDB

    一.mongonDB基本介绍 什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. Mon ...

  9. (4)WePHP 模板引入CSS js

    模板有两个定义了两个常量 父类已经定义好了 //模板常量 $dirStr=dirname($_SERVER['SCRIPT_NAME']); $dirStr=$dirStr=='\\'?NULL:$d ...

  10. 大前端涉猎之前后端交互总结3:使用PHP进行表单数据删除与查询

    1 首先:获取用户 id,根据id 删除指定的数据. 在链接完数据库之后,通过$_GET 超全局变量,获取删除的书内容 $id = $_GET['id']; 2 准备delete SQL语句: $sq ...