Python中的多进程:fork和multiprocessing
Python的多进程
套路1:os.fork()
先敲段代码:
#!/usr/bin/env python3
import os
os.fork()
print('1111111111')
执行结果:
1111111111
1111111111
- fork函数一旦运行就会生出一条新的进程,2个进程一起执行导致输出了2行。
再敲段代码:
#!/usr/bin/env python3
import os
import time
res = os.fork()
print('res == %d'%res)
if res == 0:
print('我是子进程,我的pid是:%d,我的父进程id是:%d'%(os.getpid(),os.getppid()))
else:
print('我是父进程,我的pid是:%d'%os.getpid())
执行结果:
res == 105297
我是父进程,我的pid是:105296
res == 0
我是子进程,我的pid是:105297,我的父进程id是:105296
- fork()运行时,会有2个返回值,返回值为大于0时,此进程为父进程,且返回的数字为子进程的PID;当返回值为0时,此进程为子进程。
- 注意:父进程结束时,子进程并不会随父进程立刻结束。同样,父进程不会等待子进程执行完。
- 注意:os.fork()无法在windows上运行。
套路2:multiprocessing.Process
先敲段代码,来创建一个进程:
#!/usr/bin/env python3
from multiprocessing import Process
import time
def A():
while True:
print('正在调用函数')
time.sleep(1)
p = Process(target = A) #创建进程对象,并指定进程将来要执行的函数.
p.start() #启动进程.
执行结果:
正在调用函数
正在调用函数
正在调用函数
......
再敲段代码,实现多进程同步执行:
#!/usr/bin/env python3
import time
from multiprocessing import Process
def A(num):
while True:
print('正在调用函数%d'%num)
time.sleep(1)
for i in range(2):
p = Process(target = A, args = (i,)) #创建进程对象,并指定进程将来要执行的函数.
p.start() #启动进程.
exit()
执行结果:
正在调用函数1
正在调用函数2
正在调用函数1
正在调用函数2
...
- 注意,Process创建的进程必须执行完,主程序才会结束,用exit()也不能强退。
套路3:multiprocessing.Process的run()方法
上代码
#!/usr/bin/env python3
import os
import time
from multiprocessing import Process
class NewProcess(Process): #继承Process类创建一个新类
def __init__(self,num):
self.num = num
super().__init__()
def run(self): #重写Process类中的run方法.
while True:
print('我是进程%d,我的pid是:%d'%(self.num,os.getpid()))
time.sleep(1)
for i in range(2):
p = NewProcess(i)
p.start()
执行结果:
我是进程0,我的pid是:105653
我是进程1,我的pid是:105654
我是进程0,我的pid是:105653
我是进程1,我的pid是:105654
我是进程0,我的pid是:105653
我是进程1,我的pid是:105654
...
- 当不给Process指定target时,会默认调用Process类里的run()方法。这和指定target效果是一样的,只是将函数封装进类之后便于理解和调用。
套路4:multiprocessing.Pool 进程池
#!/usr/bin/env python3
import time
from multiprocessing import Pool
def A():
for i in range(5):
print(i)
time.sleep(1)
pool = Pool(2) #定义进程池大小
for i in range(5):
pool.apply_async(A) #使用非阻塞方式调用func,阻塞是apply()
pool.close() #关闭Pool,使其不再接受新的任务
pool.join() #主进程阻塞,等待子进程的退出
- 对Pool对象调用join()方法会等待所有子进程执行完毕。调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。
- Pool.terminate():一旦运行到此步,不管任务是否完成,立即终止。
Python中的多进程:fork和multiprocessing的更多相关文章
- Python中使用多进程来实现并行处理的方法小结
进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念: 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和 ...
- 聊聊Python中的多进程和多线程
今天,想谈一下Python中的进程和线程. 最近在学习Django的时候,涉及到了多进程和多线程的知识点,所以想着一下把Python中的这块知识进行总结,所以系统地学习了一遍,将知识梳理如下. 1. ...
- 深入浅析python中的多进程、多线程、协程
深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...
- multiprocessing.Process() ----------python中的多进程
python 当中 使用封装好的 multiprocessing 为我们实现创建多进程任务. 1 Process()方法创建子进程 使用multiprocessing.Process() 方法产生一个 ...
- 关于python中的多进程模块multiprocessing
python中的multiprocessing是一个多进程管理包,主要作用也就是提供多进程,而不是多线程,在其中用的比较多估计也就是Process和Pipe两个类,如下代码所示: #!/usr/bin ...
- Python中的多进程、多线程和协程
本文中的内容来自我的笔记.撰写过程中参考了胡俊峰老师<Python程序设计与数据科学导论>课程的内容. 并发处理:多进程和多线程 前置 概念: 并发:一段时间内同时推进多个任务,但不一定要 ...
- 学习笔记--python中使用多进程、多线程加速文本预处理
一.任务描述 最近尝试自行构建skip-gram模型训练word2vec词向量表.其中有一步需要统计各词汇的出现频率,截取出现频率最高的10000个词汇进行保留,形成常用词词典.对于这个问题,我建立了 ...
- python中的多进程与多线程(二)
1.使用多线程可以有效利用CPU资源,线程享有相同的地址空间和内存,这些线程如果同时读写变量,导致互相干扰,就会产生并发问题,为了避免并发问题,绝不能让多个线程读取或写入相同的变量,因此python中 ...
- python中的多进程处理
转载于:http://blog.csdn.net/jj_liuxin/article/details/3564365 帮助文档见https://docs.python.org/2.7/library/ ...
随机推荐
- mapper中的CDATA标签的用法
术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data). 在 XML 元素中,"<" 和 "&& ...
- c++模板类编译错误
最近想写一个c++模板类,实现一个有向图.依据惯例,类在头文件中声明,类的实现写在源文件中.可是编译的时候出现了如下错误: undefined reference to 通过谷歌发现,这是一个很常见的 ...
- [解决] Error Code: 1044. Access denied for user 'root'@'%' to database
今天在测试集群用的mysql上,遇到个权限的问题: SQLException : SQL state: 42000 com.mysql.jdbc.exceptions.jdbc4.MySQLSynta ...
- poj 2449 Remmarguts' Date (k短路模板)
Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- async和await关键词用于定义原生的协程
#python为了将语义变得更加明确,就引入了async和await关键词用于定义原生的协程 # async def downloader(url): # return "xxxx" ...
- C语言分割字符串函数strtok
在编程过程中,有时需要对字符串进行分割.而有效使用这些字符串分隔函数将会给我们带来很多的便利. 下面我将在MSDN中学到的strtok函数做如下翻译. strtok :在一个字符串查找下一个符号 ch ...
- JavaScript match() 方法
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. var st ...
- 使用PTGui软件将全景图变成鱼眼图
把全景图变成鱼眼图.方法一部分是自己研究的,一部分是参考学妹街景合成鱼眼照片的方法. 需要使用的软件是PTGui.是个收费软件,价格还不便宜.操作一下,安装完后就可以开始合成鱼眼图了. 加载图像 打开 ...
- linux命令面试题
文件管理命令 (1)Linux的文件系统目录配置要遵循FHS规范,规范定义的两级目录规范如下: /home 每个账号在该目录下都有一个文件夹,进行数据的管理 /usr 有 ...
- Deep Learning基础--26种神经网络激活函数可视化
在神经网络中,激活函数决定来自给定输入集的节点的输出,其中非线性激活函数允许网络复制复杂的非线性行为.正如绝大多数神经网络借助某种形式的梯度下降进行优化,激活函数需要是可微分(或者至少是几乎完全可微分 ...