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:

最新文章

  1. Markdown基本语法
  2. 安卓贴图源码--->单点触控.多点触控.类似in/百度魔图
  3. ASP.NET Web Api
  4. HelloWorld Makefile Template
  5. 国内如何使用gem?
  6. Myelipcse导入Maven项目: version of spring facet could not be detected
  7. 捕获ClientDataSet.ApplyUpdates和SocketConnection异常
  8. SIFT算法:确定特征点方向
  9. uva 10036 Problem C: Divisibility
  10. WIN8 WIN10系统如何完全获取用户管理员权限
  11. 推荐两个针对github的chrome插件
  12. java学习笔记之日期日历类
  13. Basic FIFO Queue
  14. 我们的java基础到底有多差 一个视频引发的感想
  15. LeetCode编程训练 - 回溯(Backtracking)
  16. [SDOI2006] 保安站岗
  17. jQuery子页面获取父页面元素并绑定事件
  18. IE CSS Hack【记录】
  19. iOS之iOS11、iPhone X、Xcode9 适配指南
  20. 尚硅谷springboot学习23-SpringMVC配置

热门文章

  1. java容器——面试篇
  2. Java环境配置-jdk和jre的安装
  3. spring AOP注解实现
  4. Kafka Schema Registry | 学习Avro Schema
  5. Wireshark 抓包过滤器学习
  6. Ubuntu修改文件权限以及更换文件所有者
  7. 阅读笔记——《How a Facebook rejection pushed me to start and grow a profitable business in 12 months》
  8. JDBC使用8.0驱动包连接mysql设置时区serverTimezone
  9. NetCore踩坑记1、 一块网卡引发的血案
  10. 匿名对象序列化为XML