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 ...
随机推荐
- <转>Excel生成guid、uuid
Excel生成guid.uuid 原文地址:https://www.cnblogs.com/jory/p/7718305.html 1.Excel生成guid,uuid 格式:600d65bc- ...
- PAT甲级【2019年9月考题】——A1163 PostfixExpression【25】
7-3 Postfix Expression (25 分) Given a syntax tree (binary), you are supposed to output the correspon ...
- tensorflow队列tf.FIFOQueue | enqueue | enqueue_many | dequeue | dequeue_many
关于队列的相关知识,盗用一张https://blog.csdn.net/HowardWood/article/details/79406891的动态图 import tensorflow as tf ...
- Java并发AtomicLong接口
java.util.concurrent.atomic.AtomicLong类提供了可以被原子地读取和写入的底层long值的操作,并且还包含高级原子操作. AtomicLong支持基础long类型变量 ...
- ingress-nginx配置https文件访问
1.先将证书文件上传至服务器特定目录.比如:/root/ssl 假设证书名称为:server.crt和server.key 2.现在主节点后台创建私密文件. kubectl create secret ...
- Python3学习笔记(MOOC)
文本进度条实例 #!/usr/bin/env python3 import time #for i in range(101): # print ("\r{:3.0f}%".for ...
- Android关于界面一定时间无操作自动跳转到指定界面的实现
主要用到的功能,自定义一个定时器CountTimer继承CountDownTimer. public class CountTimer extends CountDownTimer { private ...
- shell内置命令getopts
- SSH远程管理服务实战
目录 SSH远程管理服务实战 1.SSH基本概述 2.SSH相关命令 3.Xshell连接不上虚拟机 4.scp命令 5.sftp命令 6.SSH验证方式 7.SSH场景实践 8.SH安全优化 9.交 ...
- linux 系统管理--进程管理
目录 linux 系统管理--进程管理 一.进程基本概述 二.监控进程状态 三.进程的优先级[进阶] 四.企业案例,Linux假死是怎么回事 五.后台进程管理 六.系统平均负载[进阶] linux 系 ...