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 ...
随机推荐
- [Fw]初探linux中断系统(1)
1. 重要接口 LDD上说,“内核维护了一个中断信号线的注册表,该注册表类似于I/O端口的注册表.模块在使用中断前要先请求一个中断通道(或者中断请求IRQ),然后在使用后释放该通道.” 撇开系统如何遍 ...
- matploylib之热力图
刚学我也不熟,做个笔记吧 # coding:utf-8 import numpy as np import matplotlib.pyplot as plt dx = 0.01 dy = 0.01 # ...
- Codeforces Paths and Trees
Paths and Trees time limit per test3 seconds memory limit per test256 megabytes Little girl Susie ac ...
- css来控制img正方形自适应
.div{ width:100%; height:0px; padding-bottom:100%; position:relative; } .div img{ width:100%; height ...
- 使用await写异步优化代码
使用promise: function readMsg(){ return dispatch=>{ axios.post('/msgList').then(res=>{ console.l ...
- phpredis中incr以及decr等自增命令出现的问题
在做项目中使用redis的incr以及hincrby自增时,出现自增失败,set之后的数据,无法自增,当redis中不存在该key时,直接用incr是成功的.查找了原因,是因为phpredis初始化的 ...
- go语言从例子开始之Example11.range遍历
range 迭代各种各样的数据结构.让我们来看看如何在我们已经学过的数据结构上使用 rang 吧. package main import "fmt" func main() { ...
- java 方法的定义与调用
/* 定义一个方法的格式: public static void 方法名称(){ 方法体 } 方法名称的命名规则和变量一样,使用小驼峰 方法体:也就是大括号里面的可以包含任何语句 注意事项: 1.方法 ...
- 基于AtomicReference的单例模式写法
AtomicReference类主要属性(来源于jdk1.7中的源码) public class AtomicReference<V> implements java.io.Seriali ...
- Vue.js(六)
路由(用 Vue.js + Vue Router 创建单页应用) <script src="https://unpkg.com/vue-router/dist/vue-router.j ...