在新创建的子进程中,会把父进程的所有信息复制一份,它们之间的数据互不影响。

使用os.fork()创建

该方式只能用于Unix/Linux操作系统中,在windows不能用。

import os

# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()
# 子进程永远返回0,而父进程返回子进程的ID。
if pid == 0:
print('子进程')
else:
print('父进程')

使用Process类类创建

multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:

from multiprocessing import Process
import time def test(name, age):
for i in range(5):
print("--test--%s\t%d" % (name, age))
time.sleep(1)
print("子进程结束") if __name__ == '__main__':
p = Process(target=test, args=("aaa", 18))
p.start()
# 等待进程实例执⾏结束,或等待多少秒;
p.join() # 等待的最长时间
print("主进程结束")
"""
输出结果:
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
主进程结束
"""

join()方法表示主进程等待子进程执行完成后继续往下执行,如果把join()注释掉,则主进程开启子进程后不停顿继续往下执行,然后等待子进程完成程序结束。

把join()方法注释掉的结果:

"""
输出结果:
主进程结束
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
"""

使用Process子类创建

创建新的进程还能够使用类的方式,可以自定义一个类,继承Process类,每次实例化这个类的时候,就等同于实例化一个进程对象,请看下面的实例:

from multiprocessing import Process
import time
import os class MyProcess(Process): def __init__(self):
# 如果子类要重写__init__是必须要先调用父类的__init__否则会报错
# Process.__init__(self)
super(MyProcess,self).__init__() # 重写Porcess的run()方法
def run(self):
print("子进程(%s)开始执行,父进程(%s)" % (os.getpid(), os.getppid()))
for i in range(5):
print("--1--")
time.sleep(1) if __name__ == '__main__':
t_start = time.time()
p = MyProcess()
p.start()
# p.join()
print("main")
for i in range(5):
print("--main--")
time.sleep(1)

使用进程池Pool创建

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行,请看下面的实例:

from multiprocessing import Pool
import os
import time def worker(num):
# for i in range(3):
print("----pid=%d num=%d---" % (os.getpid(), num))
time.sleep(1) if __name__ == '__main__':
# 定义一个进程池,最大进程数3
pool = Pool(3)
for i in range(10):
print("---%d--" % i)
# 使用非阻塞方式调用func(并行执行),一般用这个。
# apply堵塞方式必须等待上一个进程退出才能执行下一个进程,用的不多。
pool.apply_async(worker, (i,))
# 关闭进程池
pool.close()
# 等待所有子进程结束,主进程一般用来等待
pool.join() # 进程池后面无操作时必须有这句

最新文章

  1. ReactNative入门 —— 动画篇(上)
  2. 仿淘宝分页按钮效果简单美观易使用的JS分页控件
  3. jq 文字上下不间断滚动实例
  4. MySQL之扩展(触发器,存储过程等)
  5. 如何查看自己的linux是32位还是64位
  6. Practical Java
  7. openssl rsa 私钥 PKCS8私钥 公钥
  8. Scrapy URLError
  9. easyui datagrid 列的内容超出所定义的列宽时,自动换行
  10. 团队 / Staff_VidaMiaTangoClub_新浪博客
  11. 远程文件同步详解(Remote File Sync)
  12. DVWA 黑客攻防演练(十二) DOM型 XSS 攻击 DOM Based Cross Site Scripting
  13. 第8章 java中的并发工具类
  14. golang 文件服务器
  15. Oracle 12C -- temporal validity
  16. C/C++基础----string, vector, array
  17. ROI区域图像叠加
  18. Shell学习笔记:<<EOF子命令
  19. To keep up-to-date with Latest Jordans 2016
  20. lucene的分词器宝典

热门文章

  1. BZOJ 2959 长跑 (LCT、并查集)
  2. SCOI2009迷路
  3. postgres的数据库备份和恢复
  4. java连接mysql出现The server time zone value '�й���׼ʱ��' is unrecognized or represents more than...
  5. 8 Linux 文件类型
  6. pandas.DataFrame 中的insert(), pop()
  7. docker-compose快速部署环境笔记
  8. js 中文字符串转base64
  9. Oracle 设置主键自增长
  10. linux 基础 文件操作