python-并发编程之进程
进程
python中创建进程模块为:multiprocessing
开销非常大 是计算机中资源分配的最小单位(内存隔离) 能利用多个CPU 由操作系统控制 同时操作内存之外的数据会产生数据的不安全
进程之间数据不是共享的
注意:windowns下进程运行会报错,linux mac 不会出现此问题。解决方法:
将进程启动代码放到main里即可执行,示例代码:
import multiprocessing
def task(arg):
print(arg)
def run():
for i in range(10):
# 实例化一个进程
process = multiprocessing.Process(target=task,args=(i,))
# 进程启动
process.start()
if __name__ == '__main__':
run() # main下才能正确执行,不然会报错
进程常用方法:
join():和线程一样,默认会等子进程执行完毕后,代码才会继续往下执行daemon:- True 为 主进程执行完代码,程序会直接结束,不会等待子进程执行完毕
- False为:主进程执行完毕后,会等待子进程执行完毕
name:为进程起一个名称multiprocessing.current_process():获取当前进程ident/pid:获取当前进程的ID号
示例代码:
import time
import multiprocessing
def task(arg):
p = multiprocessing.current_process() # 获取当前进程
print(p.name) # 打印当前进程名称
print(p.ident) # 获取当前进程的ID号
print(p.pid) # 获取当前进程的ID号
time.sleep(2)
print(arg)
def run():
print('11111111')
#### 进程一
process1 = multiprocessing.Process(target=task,args=(1,))
# False 主进程执行完毕后,会等待子进程执行完毕
# True 为不等待子进程执行完毕,主进程执行完毕后,程序就会结束
process1.daemon = False
# 为当前进程起一个名称
process1.name = 'proc1'
process1.start()
# 默认会等进程执行完毕后,代码才会继续往下执行
process1.join()
print('22222222')
#### 进程二
process2 = multiprocessing.Process(target=task, args=(2,))
process2.daemon = False
process2.name = 'proc2'
process2.start()
process2.join()
print('33333333')
if __name__ == '__main__':
run()
类继承方式创建进程(示例代码如下:)
##################### 类继承方式创建进程 #####################
import multiprocessing
class MyProcess(multiprocessing.Process):
def run(self):
print('当前进程', multiprocessing.current_process())
def run():
t1 = MyProcess()
t1.start()
t2 = MyProcess()
t2.start()
if __name__ == '__main__':
run()
进程之间的数据共享
multiprocessing.Queue(列表数据共享)
windows下执行数据共享有点问题,所以使用下面方法可以解决
- 示例代码:
##################### 进程之间的数据共享 multiprocessing.Queue #####################
import multiprocessing
q = multiprocessing.Queue() # 数据共享可以使用的队列
def task(arg,q):
q.put(arg)
def run():
for num in range(10):
proc = multiprocessing.Process(target=task,args=(num,q))
proc.start()
while True:
v = q.get()
print(v)
if __name__ == '__main__':
run()
multiprocessing.Manger(字典数据共享)
linux mac下可以正常执行
示例代码:
import multiprocessing
m = multiprocessing.Manager()
dic = m.dict()
def task(arg):
dic[arg] = 100
def run():
for num in range(10):
proc = multiprocessing.Process(target=task,args=(num,))
proc.start()
input('>>>')
print(dic.values())
if __name__ == '__main__':
run()
windowns:
- 第一种方法
import multiprocessing
def task(arg,dic):
dic[arg] = 100
if __name__ == '__main__':
m = multiprocessing.Manager()
dic = m.dict()
for num in range(10):
proc = multiprocessing.Process(target=task,args=(num,dic))
proc.start()
proc.join() # 一个一个进程等待,执行完了,再执行下一个
print(dic)
- 第二种方法(linux也适用)
import time
import multiprocessing
def task(arg,dic):
time.sleep(2)
dic[arg] = 100
if __name__ == '__main__':
m = multiprocessing.Manager()
dic = m.dict()
process_list = []
for num in range(10):
proc = multiprocessing.Process(target=task,args=(num,dic))
proc.start()
process_list.append(proc)
while True:
count = 0
for p in process_list:
if not p.is_alive():
count += 1
if count == len(process_list):
break
print(dic)
进程锁
概念:不管线程还是进程,锁都是一样的
什么时候用锁: 只有进程或线程操作同一个数据的时候才会进行加锁,如果各自做各自的是不需要加锁的
具体意义看多线程里的锁机制,和进程一样
多线程锁:https://www.cnblogs.com/Hybb/p/11512011.html
锁的方法
Lock(一次放行一个)RLock递归锁(一次放行多个)BoundedSemaphore(一次放N个) 信号量Condition(1次放x个数)动态输入Event(事件)1次放所有
示例代码
import time
import multiprocessing
lock = multiprocessing.Lock()
lock = multiprocessing.RLock()
lock = multiprocessing.BoundedSemaphore()
lock = multiprocessing.Condition()
lock = multiprocessing.Event()
def task(arg):
print('开始了')
lock.acquire()
time.sleep(2)
print(arg)
lock.release()
def run():
for num in range(1,3):
proc = multiprocessing.Process(target=task,args=(num,))
proc.start()
if __name__ == '__main__':
run()
进程池
使用的模块 concurrent.futures
和线程池是一样的
示例代码:
import time
# 导入进程池模块
from concurrent.futures import ProcessPoolExecutor
def task(arg):
time.sleep(2)
print(arg)
if __name__ == '__main__':
# 创建一个进程池
pool = ProcessPoolExecutor(5)
for num in range(10):
pool.submit(task,num)
python-并发编程之进程的更多相关文章
- python并发编程之进程、线程、协程的调度原理(六)
进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...
- Python并发编程之进程池与线程池
一.进程池与线程池 python标准模块concurrent.futures(并发未来) 1.concurrent.futures模块是用来创建并行的任务,提供了更高级别的接口,为了异步执行调用 2. ...
- Python并发编程之进程
一.理论概念 1.定义 进程(Process 也可以称为重量级进程)是程序的一次执行.在每个进程中都有自己的地址空间.内存.数据栈以及记录运行的辅助数据,它是系统进行资源分配和调度的一个独立单位. 2 ...
- python并发编程之进程池,线程池,协程
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- python并发编程之进程池,线程池concurrent.futures
进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...
- python并发编程之进程池、线程池、协程
需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...
- 15.python并发编程(线程--进程--协程)
一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完 ...
- python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞
操作系统: 多道技术背景: 提高工作效率(充分利用IO阻塞的时间) 同时执行多个任务 多道技术 空间复用:充分的利用内存空间 时间复用:充分利用IO阻塞时间 分时系统: 并发:提高了程序的工作效率 两 ...
- Python并发编程(守护进程,进程锁,进程队列)
进程的其他方法 P = Process(target=f,) P.Pid 查看进程号 查看进程的名字p.name P.is_alive() 返回一个true或者False P.terminate( ...
- Python并发编程-多进程进程锁
from multiprocessing import Process import json import time from multiprocessing import Lock def sho ...
随机推荐
- HBaseRegionServer宕机数据恢复
本文由 网易云 发布 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻松地 ...
- Ubuntu添加字体
在字体库下载打包好的字体: 方正字体全库:http://www.downza.cn/soft/8203.html 华文字体:http://www.onlinedown.net/soft/635126. ...
- luoguP1540 机器翻译 题解(NOIP2010)
P1540 机器翻译 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...
- rabbitmq-5-案例1-简单的案例
最简单的案例: https://gitee.com/n_zhe/rabbitmq-demo 通过简单的例子分析mq是怎样发送和拉取消息的: quickStart中的简单案例 通过简单的案例来 ...
- 错误提示:Wrong Local header signature: 0xE011CFD0
导入Excel时出现错误,错误提示:Wrong Local header signature: 0xE011CFD0,这个是excel的扩展名问题,.xlsx 应该XSSFWorkbook work ...
- R2CNN论文思路记录
Rotational region cnn 我们的目标是检测任意方向的场景文本,与RRPN类似,我们的网络也基于FasterR-CNN ,但我们采用不同的策略,而不是产生倾斜角度建议. 我们认为RPN ...
- Halo(三)
接口中可以定义方法 1. 定义静态方法(直接调用) public interface Test { public static void method() { /** * 1.定义一个静态的带有方法体 ...
- mpu6050学习
一.MPU6050初始化 /**************************实现函数******************************************** *函数原型: ...
- 大碗宽面Beta阶段第十一周会议记录
本周二晚上我们在宿舍楼的大厅进行了本周的小组会议,虽然天气很冷,但大家都还是如数到场,积极参加小组会议.对于上周的任务大家都努力完成,在前端方面,大家完善了主页面和一些分页面,主要有导航栏界面的完成. ...
- linux之-mysql数据库约束3
在MySQL中,通常有这几种约束: DROP DATABASE mysql_shiyan;删除数据库 主键 (PRIMARY KEY)是用于约束表中的一行,作为这一行的唯一标识符,在一张表中通过主键就 ...