multiprocessing模块介绍

python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了multiprocessing。
    multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。

  multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。

Process类的介绍

创建进程的类:

Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)强调:1. 需要使用关键字的方式来指定参数2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号

参数介绍:

group参数未使用,值始终为Nonetarget表示调用对象,即子进程要执行的任务args表示调用对象的位置参数元组,args=(1,2,'egon',)kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}name为子进程的名称

方法介绍:

p.start():启动进程,并调用该子进程中的p.run() p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法  p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁p.is_alive():如果p仍然运行,返回Truep.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程

属性介绍:

p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置p.name:进程的名称p.pid:进程的pidp.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

 

Process类的使用

注意:在windows中Process()必须放到# if __name__ == '__main__':下

创建并开启子进程的两种方式

#开进程的方法一:import timeimport randomfrom multiprocessing import Processdef piao(name):   print('%s piaoing' %name)   time.sleep(random.randrange(1,5))   print('%s piao end' %name)p1=Process(target=piao,args=('zhangsan',)) #必须加,号p2=Process(target=piao,args=('lisi',))p3=Process(target=piao,args=('wangwu',))p4=Process(target=piao,args=('zhaoliu',))p1.start()p2.start()p3.start()p4.start()print('主线程')
#开进程的方法二:import timeimport randomfrom multiprocessing import Processclass Piao(Process):   def __init__(self,name):       super().__init__()       self.name=name   def run(self):       print('%s piaoing' %self.name)

       time.sleep(random.randrange(1,5))       print('%s piao end' %self.name)p1=Piao('zhangsan')p2=Piao('lisi')p3=Piao('wangwu')p4=Piao('zhaoliu')p1.start() #start会自动调用runp2.start()p3.start()p4.start()print('主线程')

Process对象的join方法

主进程等,等待子进程结束

from multiprocessing import Processimport timeimport random

class Piao(Process):   def __init__(self,name):       self.name=name       super().__init__()   def run(self):       print('%s is piaoing' %self.name)       time.sleep(random.randrange(1,3))       print('%s is piao end' %self.name)p=Piao('zangsan')p.start()p.join(0.0001) #等待p停止,等0.0001秒就不再等了print('开始')

有了join,程序不就是串行了吗???

from multiprocessing import Processimport timeimport randomdef piao(name):   print('%s is piaoing' %name)   time.sleep(random.randint(1,3))   print('%s is piao end' %name)

p1=Process(target=piao,args=('zhangsan',))p2=Process(target=piao,args=('lisi',))p3=Process(target=piao,args=('wangwu',))p4=Process(target=piao,args=('zhaoliu',))

p1.start()p2.start()p3.start()p4.start()

#有的同学会有疑问:既然join是等待进程结束,那么我像下面这样写,进程不就又变成串行的了吗?#当然不是了,必须明确:p.join()是让谁等?#很明显p.join()是让主线程等待p的结束,卡住的是主线程而绝非进程p,

#详细解析如下:#进程只要start就会在开始运行了,所以p1-p4.start()时,系统中已经有四个并发的进程了#而我们p1.join()是在等p1结束,没错p1只要不结束主线程就会一直卡在原地,这也是问题的关键#join是让主线程等,而p1-p4仍然是并发执行的,p1.join的时候,其余p2,p3,p4仍然在运行,等#p1.join结束,可能p2,p3,p4早已经结束了,这样p2.join,p3.join.p4.join直接通过检测,无需等待# 所以4个join花费的总时间仍然是耗费时间最长的那个进程运行的时间p1.join()p2.join()p3.join()p4.join()print('主线程')#上述启动进程与join进程可以简写为# p_l=[p1,p2,p3,p4]# # for p in p_l:#     p.start()# # for p in p_l:#     p.join()

name与pid

from multiprocessing import Processimport timeimport randomclass Piao(Process):   def __init__(self,name):       # self.name=name       # super().__init__() #Process的__init__方法会执行self.name=Piao-1,       #                    #所以加到这里,会覆盖我们的self.name=name       #为我们开启的进程设置名字的做法       super().__init__()       self.name=name   def run(self):       print('%s is piaoing' %self.name)       time.sleep(random.randrange(1,3))       print('%s is piao end' %self.name)p=Piao('zhangsan')p.start()print('开始')print(p.pid) #查看pid

守护进程

主进程创建守护进程

  其一:守护进程会在主进程代码执行结束后就终止

  其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children

注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止

from multiprocessing import Processimport timeimport random

class Piao(Process):   def __init__(self,name):       self.name=name       super().__init__()   def run(self):       print('%s is piaoing' %self.name)       time.sleep(random.randrange(1,3))       print('%s is piao end' %self.name)p=Piao('zhangsan')p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行p.start()print('主')
#主进程代码运行完毕,守护进程就会结束,迷惑人的例子from multiprocessing import Processfrom threading import Threadimport timedef foo():   print(123)   time.sleep(1)   print("end123")def bar():   print(456)   time.sleep(3)   print("end456")p1=Process(target=foo)p2=Process(target=bar)p1.daemon=Truep1.start()p2.start()print("main-------") #打印该行则主进程代码结束,则守护进程p1应该被终止,可能会有p1任务执行的打印信息123,因为主进程打印main----时,p1也执行了,但是随即被终止

识别图中二维码,欢迎关注python宝典

python多进程编程(一)的更多相关文章

  1. Python多进程编程

    转自:Python多进程编程 阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiproces ...

  2. 【转】Python多进程编程

    [转]Python多进程编程 序. multiprocessingpython中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Pytho ...

  3. Python 多进程编程之 进程间的通信(在Pool中Queue)

    Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...

  4. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  5. 深入理解python多进程编程

    1.python多进程编程背景 python中的多进程最大的好处就是充分利用多核cpu的资源,不像python中的多线程,受制于GIL的限制,从而只能进行cpu分配,在python的多进程中,适合于所 ...

  6. Python 简明教程 --- 26,Python 多进程编程

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 学编程最有效的方法是动手敲代码. 目录 1,什么是多进程 我们所写的Python 代码就是一个程序, ...

  7. day-4 python多进程编程知识点汇总

    1. python多进程简介 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心.Python提供了非常好用的多进程包multiprocessing,他提供了一 ...

  8. python多进程编程(二)

    进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进 ...

  9. Python多进程编程(转)

    原文:http://www.cnblogs.com/kaituorensheng/p/4445418.html 阅读目录 1. Process 2. Lock 3. Semaphore 4. Even ...

随机推荐

  1. RMAN异机恢复步骤及故障处理

    一.測试机安装OS+Oracle Software.包含配置oracle用户.组和环境变量(略) 二.開始异机恢复 1. 复制源库最新备份集.初始化參数.password文件到測试机 [oracle@ ...

  2. 获取表数据的插入SQL

    DECLARE @TABLE_NAME VARCHAR(200) SET @TABLE_NAME = 'myFunction' --表名 DECLARE @TABLE_CONDITION VARCHA ...

  3. vue 记一次编译没反应、无进度、没有任何报错的提示,但后台却TM一直消耗内存的BUG:

    控制台一直提示“building for production...”,而且spinner停止了动画! 由于没有任何的提示.况且项目的代码.结构.设计完全未知模糊的情况下,我只能按照unix的理念“使 ...

  4. websocket echo test

    http://www.websocket.org/echo.html .net websocket server http://superwebsocket.codeplex.com/ http:// ...

  5. NodeJS CSV导出文件名和内容乱码解决

    // 解决不同浏览器下载文件名称乱码 var userAgent = (req.headers['user-agent']||'').toLowerCase(); res.set('Content-T ...

  6. python模块学习之__future__

    每个程序在更新版本之后,都会相较于上一个版本有所改动.这些改动会给程序的使用者造成不小的困扰! 比如python2.xx和3.xx的改动,足够让新手们头大了! 在3中, u'xxx'和'xxx'都是字 ...

  7. vue 深入响应式原理

    vue最显著的特性就是不太引人注意的响应式系统(reactivity system),模型层(model)只是普通的javascript对象,修改它则更新视图view.这会让状态管理变得非常简单且直观 ...

  8. [转]为什么我说ORM是一种反模式

    原文地址:http://www.nowamagic.net/librarys/veda/detail/2217 上周我在在上讨论了ORM,在那以后有人希望我澄清我的意思.事实上,我曾经写文章讨论过OR ...

  9. Spring Java-based容器配置(二)

    组装Java-based的配置 使用@Import注解 跟在Spring XML文件里使用<import>元素加入模块化的配置相似,@Import注解同意你载入其它配置类中的@Bean定义 ...

  10. 如何使用 TP中的公共函数 (定义在common/common.php中的函数)

    如何使用 TP中的公共函数 (定义在common/common.php中的函数) (2011-09-30 15:32:09) 转载▼ 标签: 杂谈   1.在common/common.php 中有个 ...