python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU资源,在python中大部分情况需要使用多进程。python提供了非常好用的多进程包Multiprocessing,只需要定义一个函数,python会完成其它所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、LocK等组件

一、Process

语法:Process([group[,target[,name[,args[,kwargs]]]]])

参数含义:target表示调用对象;args表示调用对象的位置参数元祖;kwargs表示调用对象的字典。name为别名,groups实际上不会调用。

方法:

  • is_alive():

  • join(timeout):

  • run():

  • start():

  • terminate():

属性:authkey、daemon(要通过start()设置)、exitcode(进程在运行时为None、如果为-N,表示被信号N结束)、name、pid。其中daemon是父进程终止后自动终止,且自己不能产生新的进程,必须在start()之前设置。

1.创建函数,并将其作为单个进程

from multiprocessing import Process
def func(name):print("%s曾经是好人"%name)if __name__ == "__main__":p = Process(target=func,args=('kebi',))p.start()   #start()通知系统开启这个进程

2.创建函数并将其作为多个进程

from multiprocessing import Process
import random,timedef hobby_motion(name):print('%s喜欢运动'% name)time.sleep(random.randint(1,3))def hobby_game(name):print('%s喜欢游戏'% name)time.sleep(random.randint(1,3))if __name__ == "__main__":p1 = Process(target=hobby_motion,args=('小红',))p2 = Process(target=hobby_game,args=('小明',))p1.start()p2.start()

执行结果:

小红喜欢运动
小明喜欢游戏

3.将进程定义为类(开启进程的另一种方法,并不是很常用)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from multiprocessing import Process
class MyProcess(Process):def __init__(self,name):super().__init__()self.name = namedef run(self):  #start()时,run自动调用,而且此处只能定义为run。print("%s曾经是好人"%self.name)if __name__ == "__main__":p = MyProcess('kebi')p.start()  #将Process当作父类,并且自定义一个函数。

4.daemon程序对比效果

不加daemon属性

import time
def func(name):print("work start:%s"% time.ctime())time.sleep(2)print("work end:%s"% time.ctime())if __name__ == "__main__":p = Process(target=func,args=('kebi',))p.start()print("this is over")#执行结果
this is over
work start:Thu Nov 30 16:12:00 2017
work end:Thu Nov 30 16:12:02 2017

加上daemon属性

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from multiprocessing import Process
import time
def func(name):print("work start:%s"% time.ctime())time.sleep(2)print("work end:%s"% time.ctime())if __name__ == "__main__":p = Process(target=func,args=('kebi',))p.daemon = True   #父进程终止后自动终止,不能产生新进程,必须在start()之前设置p.start()print("this is over")#执行结果
this is over

设置了daemon属性又想执行完的方法:

import time
def func(name):print("work start:%s"% time.ctime())time.sleep(2)print("work end:%s"% time.ctime())if __name__ == "__main__":p = Process(target=func,args=('kebi',))p.daemon = Truep.start()p.join()  #执行完前面的代码再执行后面的print("this is over")#执行结果
work start:Thu Nov 30 16:18:39 2017
work end:Thu Nov 30 16:18:41 2017
this is over

5.join():上面的代码执行完毕之后,才会执行后i面的代码。

先看一个例子:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from multiprocessing import Process
import time,os,random
def func(name,hour):print("A lifelong friend:%s,%s"% (name,os.getpid()))time.sleep(hour)print("Good bother:%s"%name)if __name__ == "__main__":p = Process(target=func,args=('kebi',2))p1 = Process(target=func,args=('maoxian',1))p2 = Process(target=func,args=('xiaoniao',3))p.start()p1.start()p2.start()print("this is over")#执行结果:
this is over   #最后执行,最先打印,说明start()只是开启进程,并不是说一定要执行完
A lifelong friend:kebi,12048
A lifelong friend:maoxian,8252
A lifelong friend:xiaoniao,6068
Good bother:maoxian   #最先打印,第二位执行
Good bother:kebi
Good bother:xiaoniao

添加join()

from multiprocessing import Process
import time,os,random
def func(name,hour):print("A lifelong friend:%s,%s"% (name,os.getpid()))time.sleep(hour)print("Good bother:%s"%name)
start = time.time()
if __name__ == "__main__":p = Process(target=func,args=('kebi',2))p1 = Process(target=func,args=('maoxian',1))p2 = Process(target=func,args=('xiaoniao',3))p.start()p.join()   #上面的代码执行完毕之后,再执行后面的p1.start()p1.join()p2.start()p2.join()print("this is over")print(time.time() - start)#执行结果
A lifelong friend:kebi,14804
Good bother:kebi
A lifelong friend:maoxian,11120
Good bother:maoxian
A lifelong friend:xiaoniao,10252  #每个进程执行完了,才会执行下一个
Good bother:xiaoniao
this is over
6.497815370559692   #2+1+3+主程序执行时间

改变一下位置

from multiprocessing import Process
import time,os,random
def func(name,hour):print("A lifelong friend:%s,%s"% (name,os.getpid()))time.sleep(hour)print("Good bother:%s"%name)
start = time.time()
if __name__ == "__main__":p = Process(target=func,args=('kebi',2))p1 = Process(target=func,args=('maoxian',1))p2 = Process(target=func,args=('xiaoniao',3))p.start()p1.start()p2.start()p.join()   #需要2秒p1.join()  #到这时已经执行完p2.join()   #已经执行了2秒,还要1秒print("this is over")print(time.time() - start)#执行结果A lifelong friend:kebi,13520
A lifelong friend:maoxian,11612
A lifelong friend:xiaoniao,17064  #几乎是同时开启执行
Good bother:maoxian
Good bother:kebi
Good bother:xiaoniao
this is over
3.273620367050171  #以最长时间的为主

6.其它属性和方法

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from multiprocessing import Process
import time
def func(name):print("work start:%s"% time.ctime())time.sleep(2)print("work end:%s"% time.ctime())if __name__ == "__main__":p = Process(target=func,args=('kebi',))p.start()p.terminate()  #将进程杀死,而且必须放在start()后面,与daemon的功能类似#执行结果
this is over
from multiprocessing import Process
import time
def func(name):print("work start:%s"% time.ctime())time.sleep(2)print("work end:%s"% time.ctime())if __name__ == "__main__":p = Process(target=func,args=('kebi',))# p.daemon = Trueprint(p.is_alive())p.start()print(p.name)   #获取进程的名字print(p.pid)    #获取进程的pidprint(p.is_alive())  #判断进程是否存在print("this is over")

python多进程编程常用到的方法相关推荐

  1. Python机器视觉编程常用数据结构与示例

    Python机器视觉编程常用数据结构与示例 本文总结了使用Python进行机器视觉(图像处理)编程时常用的数据结构,主要包括以下内容: 数据结构 通用序列操作:索引(indexing).分片(slic ...

  2. python多进程编程实例_[python] Python多进程编程技术实例分析

    这篇文章主要介绍了Python多进程编程技术,包括了线程.队列.同步等概念及相关的技巧总结,需要的朋友可以参考下 本文以实例形式分析了Python多进程编程技术,有助于进一步Python程序设计技巧. ...

  3. python编程图文_深入Python多进程编程基础——图文版

    多进程编程知识是Python程序员进阶高级的必备知识点,我们平时习惯了使用multiprocessing库来操纵多进程,但是并不知道它的具体实现原理.下面我对多进程的常用知识点都简单列了一遍,使用原生 ...

  4. python多进程编程实例_Python多进程编程multiprocessing代码实例

    下面记录一下多进程编程的别一种方式,即使用multiprocessing编程 import multiprocessing import time def get_html(n): time.slee ...

  5. Python多进程编程及多进程间的通信,数据传输

    多进程编程及进程间的通信多进程的优缺点进程(process)三态五态(三态的基础上增加了新建态和终止态)进程优先级进程特征孤儿进程僵尸进程要求理解多进程编程进程相关的函数多进程模块Process()创 ...

  6. Python列表操作常用函数、方法大全

    目录 简介 列表基本方法 访问列表元素(即索引) index方法 enumerate()函数 在列表中添加元素 append方法 insert方法 修改列表元素 删除列表元素 del语句 pop()函 ...

  7. 【python第三方库】python多进程编程multiprocessing库和subprocess库的区别与使用

    多进程,多线程介绍请阅读blog python多线程编程请阅读blog 文章目录 一.mutiprocessing库与subprocess库的区别 二.multiprocessing使用介绍 1. 创 ...

  8. 01 基于进程的并行- Python多进程编程

      在Python里面,由于有全局解释器锁的存在,在同一时刻只能有一个线程在执行,因此如果是计算密集型的任务,要想实现并行,需要采用多进程编程. 1.基本概念 1.1 进程的概念   进程(Proce ...

  9. python raise valueerror_请教:Python多进程编程时出现raise ValueError(Pool not running) 为什么?。...

    问题描述 我在进行多线程编程时使用如下方代码,当输入一般print()等简单函数时均正常, 但是一旦为调用我自己的函数时运行就会出现 : raise ValueError("Pool not ...

最新文章

  1. Android基于mAppWidget实现手绘地图(四)--如何附加javadoc
  2. 解密蚂蚁金服MISA:37℃的自助语音交互是怎么做到的?
  3. 简单易懂的现代魔法——Play Framework攻略4
  4. 训练集数量对神经网络光谱的影响
  5. 手把手教你从Core Data迁移到Realm
  6. SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值)
  7. 图片的base64编码实现以及网页上显示
  8. 为某人命名以重新连接到您的服务器
  9. linux -rpm,linux 的rpm命令
  10. python自动补全_Windows 下python的tab自动补全
  11. ISA2006之SP1的作用
  12. 创业团队如何在低成本的情况下保护网站安全
  13. linux 查看系统内存及系统负载
  14. CRT软件使用-连接虚拟机
  15. 全民一起玩Python 之 基础篇视频教程
  16. Swift语言实战晋级-第9章 游戏实战-跑酷熊猫-1
  17. c语言一行灯的熄灯问题,熄灯问题 --POJ 2811-ACM
  18. 最简解决方案--安装ubuntu 遇到32位 EFI(UEFI) /EFI/BOOT/bootia32.efi unavilable
  19. Ghost for Linux 出色的硬盘对拷工具(转)
  20. 智能灯控制页面用HTML编写,3分钟教你创建手机APP控制全彩智能灯泡应用,图形化编程!...

热门文章

  1. iPhone7总不在服务区?免费网络电话可解通话烦恼
  2. 全新的 flow.ci Dashboard 上线
  3. Spring学习之Bean的配置
  4. GRUB2 管理器—Grub Customizer
  5. 380v pcb 接线端子_插拔式PCB接线端子选型参考
  6. 【整理】固定资产后续业务处理
  7. ABAP快速代码提示功能
  8. ABAP 关于ALV布局保存选项的讲解
  9. SD-关于定价日期的设置
  10. 你知道Material Type(ROH,HALB,FERT…)为什么缩写是ROH,HALB,FERT吗?哈哈哈