python多进程操作实例
作者:junjie 发布时间:2021-12-02 21:42:46
由于CPython实现中的GIL的限制,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况我们需要使用多进程。 这也许就是python中多进程类库如此简洁好用的原因所在。在python中可以向多线程一样简单地使用多进程。
一、多进程
process的成员变量和方法:
>>class multiprocessing.Process([group[, target[, name[, args[, kwargs]]]]]) 来的定义类似于threading.Thread。target表示此进程运行的函数,args和kwargs表示target的参数。
>>name, pid
分别表示进程的名字,进程id。
>> daemon成员
daemon标志位bool变量,需要在start()调用前设置。daemon的初始值是从父进程继承而来。当一个进程结束的时候,它尝试去结束它的所有的daemon子进程。
注意:
daemon进程不允许创建子进程。否则当daemon进程结束的时候它的子进程不能被结束。
这里的daemon不是Unix的daemon进程,当父进程结束的时候所有的daemon子进程也将被终止(对于非daemon进程,父进程不等待非daemon的紫子进程,除非显示地对非daemon子进程使用join()方法)。
>> exitcode
如果进程还没有退出,则为None,如果正确的退出则为0,如果有错误则为>0的错误代码,如果进程为终止则为-1*singal。
>> start(), is_live(), terminate()
start()用来启动进程,is_live()用来查看进程的状态,terminate()用来终止进程。
>> run()
可以在process的子类中重载run()方法,从而设定进程的任务。重载process是构造新进程的另一种方式,一定程度上上等价于process的target参数。
multiprcessing的静态方法:
>> multiprocessing.cpu_count()
用来获得当前的CPU的核数,可以用来设置接下来子进程的个数。
>> multiprocessing.active_children()
用来获得当前所有的子进程,包括daemon和非daemon子进程。
实例:
import multiprocessing
import time
import sys
def worker(num):
p = multiprocessing.current_process()
print ('Starting:' + p.name + ":" + str(p.pid))
print(str(num))
sys.stdout.flush()
print ('Exiting :' + p.name + ":" + str(p.pid))
sys.stdout.flush()
def daemon():
p = multiprocessing.current_process()
print ('Starting:' + p.name + ":" + str(p.pid))
sys.stdout.flush()
time.sleep(10)
print ('Exiting :' + p.name + ":" + str(p.pid))
sys.stdout.flush()
def non_daemon():
p = multiprocessing.current_process()
print ('Starting:' + p.name + ":" + str(p.pid))
sys.stdout.flush()
time.sleep(20)
print ('Exiting :' + p.name + ":" + str(p.pid))
sys.stdout.flush()
if __name__ == '__main__':
w = multiprocessing.Process(name='worker', target=worker, args=(100,))
d = multiprocessing.Process(name='daemon', target=daemon)
d.daemon = True
nd = multiprocessing.Process(name='non-daemon', target=non_daemon)
w.start()
d.start()
nd.start()
print("the number of CPU is " + str(multiprocessing.cpu_count()))
print("All children processes:")
for p in multiprocessing.active_children():
print("child:" + p.name + ":" + str(p.pid))
print()
w.join()
#d.join()
运行结果:
可以从上面的例子看到没有多非daemon子进程使用join()方法,结果父进程没有等待非daemon进程结束就退出了。


猜你喜欢
- 一、Python的字典在项目的开发过程中,如果遇到有映射关系的内容可以考虑使用Python中的字典进行存储数据,字典中冒号前的数据称为【键】
- try 块允许您测试代码块以查找错误。except 块允许您处理错误。finally 块允许您执行代码,无论 try 和 except 块的
- 前言1.装饰器本质是一个语法糖,是对被装饰方法或类进行的功能扩充,是一种面向切面的实现方法2.装饰器可以分成方法装饰器和类装饰器,他们的区别
- #!/bin/perlprint "please input some lines,then press Ctrl+Z. \n&q
- 安装sql server 2008 management,提示错误:Sql2005SsmsExpressFacet 检查是否安装了 SQL
- idea git切换分支方法点击下方的git,checkout出要开发的分支切换多个分支后如何保maven正常idea 多个分支来回切换后会
- 1、挂接事件,比如onkeydown事件,要在FCKeditor_OnComplete里实现: function FCKeditor_OnC
- 最多16列。 create table test ( f1 int, f2 int, f3 int, f4 int, f5 int, f6
- 在现实的图像操作软件中,经常碰到的不是给出放大多少倍,而是由用户在软件的界面上选择多大的区域,或者选择几个点,那么这样情况下,怎么样来计算出
- mac下安装mysql8.0.11时 要求输入密码 之后想修改密码注意 此方法适用于mac下的mysql8.0.11 其他版本不一定相同1.
- 我就废话不多说了,大家还是直接看代码吧~# 用一行代码实现for循环初始化数组o = 10b = [ o + u for u in rang
- 代码如下: EXEC sp_rename '表名.[原列名]', '新列名', 'column
- Python 的代码风格由 PEP 8 描述。这个文档描述了 Python 编程风格的方方面面。在遵守这个文档的条件下,不同程序员编写的 P
- 在本教程中,我们将学习如何创建一个使用Django作为后端的天气应用程序。Django提供了一个基于Python Web框架的Web框架,允
- 现在,我们已经把一个Web App的框架完全搭建好了,从后端的API到前端的MVVM,流程已经跑通了。在继续工作前,注意到每次修改Pytho
- 需求描述:展示信息时其中部门区域是未知数量的,需要通过遍历进行展示。如下图举例,其中地址和备注是一一对应关系,需遵循该样式。问题描述:起初我
- 简介Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene&trad
- 1. top命令和日志方式判定卡死的位置python代码忽然卡死,日志不输出,通过如下方式可以确定线程确实已经死掉了:# top 命令top
- 这篇文章主要介绍了python with (as)语句实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 在教材实例编写雷达图时出现ValueError,具体如下:ValueError: The number of FixedLocator lo