Python3-multiprocessing模块-多进程
Python3中的multiprocessing模块是一个与threading模块类似,提供生成进程的API
多进程multiprocessing模块允许程序员充分利用给定机器上的多个CPU(处理器),但注意CPU是不认识进程的,进程更像是一个线程的容器,这也是为啥一个进程至少包含一个线程,但进程有两个缺点:
1.进程在同一时间只能干一件事,如果想同时干两件事或以上,进程就心有余而力不足了
2.进程在执行过程中如果被阻塞,比如等待输入,整个进程就会被挂起,无法做后面的操作
import os
import multiprocessing as mp def process_func(name):
print("进程ID,%s" % os.getpid())
print("父进程ID,%s" % os.getppid())
print("Hello,%s" % name)
print("--------------------------") if __name__ == "__main__":
p = mp.Process(target=process_func, args=("Jet", )) # 创建进程1
p2 = mp.Process(target=process_func, args=("Jack",)) # 创建进程2
p.start() # 启动进程1
p2.start() # 启动进程2
创建多进程实例
进程间的数据交互
不同进程的内存都是独享的,所以要想实现不同进程间的数据交互,主要有两种方式:
1.使用multiprocessing.Queue队列,特点是:FIFO(先进先出)同时它也是线程安全的
import multiprocessing as mp
"""
Queue进程间的互相通讯
特点: FIFO(先进先出) 线程安全
""" def process_func(q):
print("Hello,%s" % q.get()) # 取数据
print("Hello,%s" % q.get())
print("Hello,%s" % q.get()) if __name__ == "__main__":
que = mp.Queue()
que.put("Jet is 1") # 存数据
que.put("Jack is 2")
que.put("Judy is 3")
p = mp.Process(target=process_func, args=(que, )) # 创建进程
p.start() # 启动进程
2.使用multiprocessing.Pipe()管道函数,获取两个连接对象来进程通讯,特点是:双向收发
import multiprocessing as mp
"""
Pipes进程间的互相通讯
特点: 利用两个连接对象进行收发通讯
""" def process_func(conn):
print("Hello,%s" % conn.recv()) # 接收数据
print("Hello,%s" % conn.recv())
print("Hello,%s" % conn.recv())
conn.send("你好") # 发送数据
conn.close() if __name__ == "__main__":
front_conn, behind_conn = mp.Pipe()
front_conn.send("Jet is 1") # 发送数据
front_conn.send("Jack is 2")
front_conn.send("Judy is 3")
p = mp.Process(target=process_func, args=(behind_conn, )) # 创建进程
p.start() # 启动进程
p.join()
print(front_conn.recv()) # 接收数据
front_conn.close()
进程间的数据共享
能不能让不同的进程之间共享一份数据呢,答案是肯定的,不过就要使用Manager对象了,而且Manager是线程安全的
import multiprocessing as mp
"""
Manager进程间的数据共享
特点: 多个进程之间共享一些数据
""" def process_func(d, name ):
d[name] = name if __name__ == "__main__":
with mp.Manager() as mgr:
dt = mgr.dict()
p = mp.Process(target=process_func, args=(dt, "Jet")) # 创建进程
p1 = mp.Process(target=process_func, args=(dt, "Jack")) # 创建进程
p1.start()
p.start() # 启动进程
p.join()
p1.join()
print(dt)
进程同步
如果多个进程的目标为同一个对象时,比如多个进程都要向屏幕输出,那么此时,就要让这些进程变成串行的,怎么办?加锁!
import os
import time
import multiprocessing as mp def process_func(l, name):
try:
l.acquire()
print("进程ID,%s" % os.getpid())
print("父进程ID,%s" % os.getppid())
print("Hello,%s" % name)
print("--------------------------")
time.sleep(2)
finally:
l.release() if __name__ == "__main__":
lock = mp.Lock()
p = mp.Process(target=process_func, args=(lock, "Jet", )) # 创建进程1
p2 = mp.Process(target=process_func, args=(lock, "Jack",)) # 创建进程2
p.start() # 启动进程1
p2.start() # 启动进程2
进程池
进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止
from multiprocessing import Process, Pool
import time def process_func(i):
time.sleep(1)
print(i)
return i + 100 def callback_func(arg):
print('-->exec done:', arg) if __name__ == "__main__":
pool = Pool(3)
for i in range(10):
pool.apply_async(func=process_func, args=(i,), callback=callback_func) # 异步调用
# pool.apply(func=Foo, args=(i,)) # 同步调用 print('end')
pool.close()
pool.join() # 进程池中的进程执行玩在关闭,先close()在 join()
参考资料
http://www.cnblogs.com/alex3714/articles/5230609.html
http://python.usyiyi.cn/translate/python_352/library/multiprocessing.html
Python3-multiprocessing模块-多进程的更多相关文章
- python3 multiprocessing 模块
多进程 Multiprocessing 模块 multiprocessing 模块官方说明文档 Process 类 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函 ...
- 多进程 multiprocessing 模块进程并发Process;Pool ;Queue队列 、threading模块;
multiprocessing 模块中的 Process类提供了跨平台的多进程功能,在windows和linux系统都可以使用. 1.首先要实例化一个类,传入要执行的函数. 实例名 = Process ...
- 使用multiprocessing模块创建多进程
# 使用multiprocessing模块创建多进程 # multiprcessing模块提供了一个Process类来描述一个进程对象. # 创建子进程时,只需要传入一个执行函数和函数的参数,即可完成 ...
- 多进程Multiprocessing模块
多进程 Multiprocessing 模块 先看看下面的几个方法: star() 方法启动进程, join() 方法实现进程间的同步,等待所有进程退出. close() 用来阻止多余的进程涌入进程池 ...
- python多进程multiprocessing模块中Queue的妙用
最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...
- python之多进程multiprocessing模块
process类介绍 multiprocessing 模块官方说明文档 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建 ...
- python 3 并发编程之多进程 multiprocessing模块
一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...
- 多进程编程——理论讲解与 multiprocessing 模块
多进程编程 import os pid = os .fork() 功能 :创建新的进程 参数: 无 返回值 :失败返回一个负数 成功:在原有进程中返回新的进程的PID号 在新进程中返回为0* 子进程会 ...
- 进程,多进程,进程与程序的区别,程序运行的三种状态,multiprocessing模块中的Process功能,和join函数,和其他属性,僵尸与孤儿进程
1.进程 什么是进程: 一个正在被运行的程序就称之为进程,是程序具体执行的过程,是一种抽象概念,进程来自操作系统 2.多进程 多个正在运行的程序 在python中实现多线程的方法 from mult ...
- Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab ...
随机推荐
- 自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧
一:背景 1. 讲故事 曾今在项目中发现有同事自定义结构体的时候,居然没有重写Equals方法,比如下面这段代码: static void Main(string[] args) { var list ...
- 关于oauth安全
白话认证流程 A)用户打开客户端以后,客户端要求用户给予授权.(比如说你登陆淘宝,通过QQ这个第三方来登录时,这个时候淘宝将你引导至QQ的认证服务器) B)用户同意给客户端授权.(这个时候在你手机上弹 ...
- Java分层经验
在学习和使用Java的过程中,我们时常要用到各种工具与技术,它们在某些时候可以大幅度地简化编程,利用好它们,可以让代码更强壮.下面的表格是我总结的关于java开发可能会用到的工具与它们在项目中扮演的角 ...
- 【JVM】关于OOM的二三事
组织架构 严格来说,StackOverflowError和OutOfMemoryError都属于错误,而不是异常. java.lang.StackOverflowError public class ...
- Sublime Text3 注册码(Windows/Build 3176版本)| 开发工具
转自:dushusir.com 1.修改hosts文件(路径:C:\Windows\System32\drivers\etc): 0.0.0.0 www.sublimetext.com 0.0.0.0 ...
- SpringBoot学习笔记(十五:OAuth2 )
@ 目录 一.OAuth 简介 1.什么是OAuth 2.OAuth 角色 3.OAuth 授权流程 4.OAuth授权模式 4.1.授权码 4.2.隐藏式 4.3.密码式 4.4.凭证式 二.实践 ...
- PELT(Per-Entity Load Tracking)
引言 对于Linux内核而言,做一款好的进程调度器是一项非常具有挑战性的任务,主要原因是在进行CPU资源分配的时候必须满足如下的需求: 1.它必须是公平的 2.快速响应 3.系统的throughput ...
- Java实现二分图的最大权匹配
1 问题描述 何为二分图的最大权匹配问题? 最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大. 2 解决方案 解决这个问题可以用KM算法.理解KM算法需要首先理解& ...
- 关于uniapp获取当前距离屏幕顶部的距离
onPageScroll(e){ console.log(e); }
- Mysql的默认最大连接数及如何修改
一.Mysql默认最大连接数 通过查看mysql安装目录的my.ini文件,发现mysql的默认最大的连接数为100,实际场景中,以及进行压测时,100时远远不够的,一般都会设置最大的连接数. 二.如 ...