python_并发编程——多进程
2024-08-22 01:02:32
from multiprocessing import Process
import os def func1():
print('子进程1',os.getpid()) #子进程:获取当前进程的进程号
print('子进程的父进程:', os.getppid()) #获取进程的父进程id
def func2():
print('子进程2',os.getpid())
print('子进程的父进程:', os.getppid())
def func3():
print('子进程3',os.getpid())
print('子进程的父进程:', os.getppid()) if __name__ == '__main__':
p1 = Process(target=func1) #注册:将函数名(内存地址)注册进子进程
p2 = Process(target=func2) #p1是一个进程对象
p3 = Process(target=func3)
p1.start() #开启了一个子进程
p2.start() #三个并行的子进程
p3.start()
print('父进程:',os.getpid()) #父进程:获取当前进程的进程号
print('父进程的父进程:', os.getppid()) #获取进程的父进程id
子进程的执行顺序会变化,说明三个子进程是并行的。
传递参数:
from multiprocessing import Process
import os def func1(args): #args接收参数
print('子进程1',os.getpid()) #子进程:获取当前进程的进程号
print('子进程的父进程:', os.getppid()) #获取进程的父进程id
print(args) #打印传递进来的参数 if __name__ == '__main__':
p1 = Process(target=func1,args=('参数',)) #以元组的形式传递参数,如果只传递一个参数必须要加一个逗号
p1.start()
print('父进程:',os.getpid()) #父进程:获取当前进程的进程号
print('父进程的父进程:', os.getppid()) #获取进程的父进程id
结果:
开启多个子进程方法:
from multiprocessing import Process def func1(args):
print('*'*args) if __name__ == '__main__':
# 可以使用for循环实现开启多个子进程
for i in range(1,5):
p1 = Process(target=func1,args=(i,))
p1.start()
结果1: 结果2:
多进程join()方法:
from multiprocessing import Process def func1(args):
print('子进程1')
print(args) if __name__ == '__main__':
p1 = Process(target=func1,args=('参数',))
p1.start()
print('hahahahha')
# 感知一个子进程的结束,将异步变为同步:join之前为异步
p1.join()
# join之后为同步
print('qqqqqqqqq')
结果:
实践:我们想实现先异步输出10句话,最后同步输出执行完毕的结果。
from multiprocessing import Process def func1(args):
print('*'*args) if __name__ == '__main__':
for i in range(10):
p1 = Process(target=func1,args=(i,))
p1.start()
p1.join()
print('执行完毕!')
但是我们发现,“执行完毕”四个字总是跟随在最长的一句话后面打印输出,然而因为上面10句话是异步的,最长的那句话并不是每次都最后输出,所以我们这样不能现实我们的需求。
from multiprocessing import Process def func1(args):
print('*'*args) if __name__ == '__main__':
p_list = [] #创建一个空列表用来存放等会生产的进程对象
for i in range(10):
p1 = Process(target=func1,args=(i,))
p_list.append(p1)#将每个进程对象依次存放进列表中
p1.start()
[i.join() for i in p_list] # 运用列表推导式:循环列表,依次对列表中的进程对象执行join()方法。之前所有进程必须在这里执行完才能执行下面的代码。
print('执行完毕!')
结果1: 结果2:
最新文章
- Markdown基本语法
- 安卓贴图源码--->;单点触控.多点触控.类似in/百度魔图
- ASP.NET Web Api
- HelloWorld Makefile Template
- 国内如何使用gem?
- Myelipcse导入Maven项目: version of spring facet could not be detected
- 捕获ClientDataSet.ApplyUpdates和SocketConnection异常
- SIFT算法:确定特征点方向
- uva 10036 Problem C: Divisibility
- WIN8 WIN10系统如何完全获取用户管理员权限
- 推荐两个针对github的chrome插件
- java学习笔记之日期日历类
- Basic FIFO Queue
- 我们的java基础到底有多差 一个视频引发的感想
- LeetCode编程训练 - 回溯(Backtracking)
- [SDOI2006] 保安站岗
- jQuery子页面获取父页面元素并绑定事件
- IE CSS Hack【记录】
- iOS之iOS11、iPhone X、Xcode9 适配指南
- 尚硅谷springboot学习23-SpringMVC配置
热门文章
- java容器——面试篇
- Java环境配置-jdk和jre的安装
- spring AOP注解实现
- Kafka Schema Registry | 学习Avro Schema
- Wireshark 抓包过滤器学习
- Ubuntu修改文件权限以及更换文件所有者
- 阅读笔记——《How a Facebook rejection pushed me to start and grow a profitable business in 12 months》
- JDBC使用8.0驱动包连接mysql设置时区serverTimezone
- NetCore踩坑记1、 一块网卡引发的血案
- 匿名对象序列化为XML