python_并发编程——多进程
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:
python_并发编程——多进程的更多相关文章
- python_并发编程——多进程的第二种启动方式
1.多进程的第二种启动方式 import os from multiprocessing import Process # 创建一个自定义类,继承Process类 class MyProcess(Pr ...
- python并发编程&多进程(二)
前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...
- python并发编程&多进程(一)
本篇理论居多,实际操作见: python并发编程&多进程(二) 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行) ...
- Python 3 并发编程多进程之进程同步(锁)
Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1. ...
- Python 3 并发编程多进程之守护进程
Python 3 并发编程多进程之守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemo ...
- Python 3 并发编程多进程之队列(推荐使用)
Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往 ...
- Python并发编程-多进程
Python并发编程-多进程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多进程相关概念 由于Python的GIL全局解释器锁存在,多线程未必是CPU密集型程序的好的选择. ...
- python 并发编程 多进程 目录
python multiprocessing模块 介绍 python 开启进程两种方法 python 并发编程 查看进程的id pid与父进程id ppid python 并发编程 多进程 Proce ...
- python 并发编程 多进程 队列目录
python 并发编程 多进程 队列 python 并发编程 多进程 生产者消费者模型介绍 python 并发编程 多进程 生产者消费者模型总结 python 并发编程 多进程 JoinableQue ...
随机推荐
- async + promise 解决回调地狱
// 解决异步回调地狱的方案: async + promise async function writeFile() { // 打开文件 const fd = await new Promis ...
- 【LeetCode】最长回文子串【动态规划或中心扩展】
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: " ...
- 【面试】IP数据报格式分析
(除选项外的报头区总共20个字节) 1)版本:IPV4/IPV6 2)头长度:报头区长度,用于计算数据区的开始位置,比如头长度为6,代表报头区长度为6*4个字节,头长度的单位为4字节,所以报头区长度不 ...
- Java设计模式--代理模式+动态代理+CGLib代理
静态代理 抽象主题角色:声明真实主题和代理主题的共同接口. 代理主题角色:代理主题内部含有对真实主题的引用,从而在任何时候操作真实主题对象:代理主题提供一个与真实主题相同的接口,以便在任何时候都可以代 ...
- pyhton数据类型:字典、集合、列表、元组
基本常识 元组 列表 字典 集合 初始化 tuple=(1,2,3,4) list=[1,2,3,4] dic={'a':12,'b':34} set={1,2,3,4} 元素索引 tuple[0] ...
- Mysql数据库索引IS NUll ,IS NOT NUll ,!= 是否走索引
声明在前面 总结就是 不能单纯说 走和不走,需要看数据库版本,数据量等 ,希望不要引起大家的误会,也不要被标题党误导了. 1 数据库版本: 2 建表语句 CREATE TABLE s1 ( id IN ...
- 【C#】上机实验三
实验1: 定义一个 TimePeiod 类 包含: hour , minute , second 实现时间的在 时分秒上的加法. using System; using System.Collecti ...
- SpringBoot与整合其他技术
SpringBoot与整合其他技术 5.1 SpringBoot整合Mybatis 5.1.1 添加Mybatis的起步依赖 <!--mybatis起步依赖--> <dependen ...
- 最简单 无返回值 无参数 sql server存储过程
CREATE proc Upadte_stateas update Table_1 set [state]=2 where id in (select id from Table_1 where st ...
- docker 入坑4
搭建mongodb $ docker run --name mongo -it -d -p : -v ~/docker-data/mongo:/data/db -e MONGO_INITDB_ROOT ...