文档章节

Python学习-并发编程之多进程

D7
 D7
发布于 2017/08/30 14:59
字数 1129
阅读 3
收藏 0
点赞 0
评论 0

Python学习-并发编程之多进程

multiprocessing模块概述

​ 由于Python设计的限制(我说的是咱们常用的CPython)。最多只能用满1个CPU核心。Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Lock、Queue、Pipe等组件,注意:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。

创建子进程

​ 创建子进程需要用到multiprocessing模块的Process类,由该类实例化得到的对象,表示一个子进程中的任务(尚未启动),需要用该类实例化得到对象的start方法开启子进程。

Process类概述:

# Process类概述:
class Process(object):
  	'''
  	group:参数一直为None;
    target:参数为子进程要执行的代码,即函数的地址;
    name:参数为子进程的名称,可以自定义;
    args:即以位置传参的方式给子进程要执行的代码传递参数,传参时必须时元组形式;
    kwargs:即以关键字传参的方式给子进程要执行的代码传递参数;
    '''
    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
        self.name = ''				# 进程的名称
        self.daemon = False			# 是否开启守护进程
        self.authkey = None			# 进程的身份验证键
        self.exitcode = None		# 进程在运行时为None、如果为–N,表示被信号N结束。
        self.ident = 0
        self.pid = 0				# 进程的pid
        self.sentinel = None			

    def run(self):				
      	'''进程启动时运行的方法,正是它去调用target指定的函数。'''
        pass

    def start(self):			
      	'''启动进程,并调用该子进程中的run()方法。'''
        pass

    def terminate(self):		
      	'''
      	强制终止子进程,不会进行任何清理操作,
      	如果该进程创建了子进程,该子进程就成了僵尸进程,
      	如果该进程还保存了一个锁那么也将不会被释放,进而导致死锁。
      	'''
        pass

    def join(self, timeout=None):	
      	'''主进程等待子进程执行完毕才继续执行,timeout参数为等待时间。'''
        pass

    def is_alive(self):				
      	'''如果子进程还在运行,返回True。'''
        return False

子进程的应用(方法一)

# 把要执行函数的函数地址传给进程对象
import random
from multiprocessing import Process

# 创建一个函数,函数处理,如果一个数 可以整除2就整除,不能整除就*3+1再整除,直到结果为1
def Calculation(value, count):			
    if value == 1:
        print(count)					
        return
    if value % 2 == 0:	
        count += 1						
        value = value / 2
    else:
        value = value * 3 + 1
    Calculation(value, count)			
    
# 注意:在windows中Process()必须放到# if __name__ == '__main__':下
if __name__ == '__main__':
    count = 0
    # 创建子进程时,所有参数必须按关键子方式传参,且args必须为一个元组,最后一个元素末尾要加“,”
    process_1 = Process(target=Calculation, args=(random.randint(1, 10), count, ))
    process_2 = Process(target=Calculation, args=(random.randint(1, 10), count, ))
    # 使用start()开启子进程
    process_1.start()
    process_2.start()

子进程的应用(方法二)

import random
from multiprocessing import Process

class Sub_Process(Process):				# 创建一个继承Process的类
    def __init__(self, value, count):
        super().__init__()				# 用super()方法调用Process类的__init__()方法
        self.value = value
        self.count = count

    def run(self):						# 注意:子进程类必须有run()方法
        self.Calculation(self.value, self.count)	# run()方法中包含需要执行的代码

    def Calculation(self, value, count):  # 创建进程需要执行的函数
        if value == 1:
            print(count)
            return
        if value % 2 == 0:
            count += 1
            value = value / 2
        else:
            value = value * 3 + 1
        self.Calculation(value, count)

# 注意:在windows中Process()必须放到# if __name__ == '__main__':下
if __name__ == '__main__':
    count = 0
    process_1 = Sub_Process(random.randint(1, 10), count)	# 实例化一个子进程对象
    process_2 = Sub_Process(random.randint(1, 10), count)

    process_1.start()		# 开启子进程
    process_2.start()

Process类其他属性及方法的应用:

# Process类的其他属性及方法概述:

# daemon属性
process_1.daemon = True		# 开启守护进程,即父进程结束后,不管子进程是否运行完都一起结束

# pid属性
print(process_1.pid)		# 打印子进程pid

# name属性
process_1.name = "dengqi"	# 设置子进程的名称

# terminate()方法
process_1.terminate() 		# 强制终止子进程,但不会终止进程锁和子子进程

# is_alive()方法
process_1.is_alive()		# 返回子进程的状态,布尔值

# join()方法
process_1.join(3)			# 等待子进程结束,如果子进程不结束,程序则不往下执行,等待时间为3秒

© 著作权归作者所有

共有 人打赏支持
D7

D7

粉丝 0
博文 5
码字总数 5326
作品 0
海淀
技术主管
Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程 网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba 备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Pytho...

人气王子333 ⋅ 04/23 ⋅ 0

Python:经过了十几年,你们还没有消除的对我的误解吗?

摘要: 大学毕业到现在用的最多的编程语言还是C,C++,后来学习了一下Python,觉得Python是门学了不后悔的语言。尤其适合非程序员学习,作为青少年学习计算机的首门语言也不错,大学生学习计...

雁横 ⋅ 05/03 ⋅ 0

荐书丨确认过眼神,这份Python书单一定是你的菜

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 Python 是军刀型的开源工具,被广泛应用于Web 开发、爬虫、数据清洗、自然语言处理、机器学习和人工智能等方...

csdnsevenn ⋅ 05/05 ⋅ 0

想用 Python 找到一份好工作?这4种工作最热门!

身边有不少朋友最近都开始学习python,大多都在学了一两个月之后来问小编,我现在已经入行了,能去找什么样的工作呢? 小编只能说: 入行!=找工作 那么,自学python的人,如何才能找到满意的工...

python达人 ⋅ 05/16 ⋅ 0

2018年被称为中国人工智能元年,人工智能技术已经成为国家战略,在2017的一年里,人工智能技术得到重视,已逐渐渗透到其它行业,无人超市、人脸识别、自动驾驶、智能家居等“黑科技”早已成为各大媒体的头

2018年被称为中国人工智能元年,人工智能技术已经成为国家战略,在2017的一年里,人工智能技术得到重视,已逐渐渗透到其它行业,无人超市、人脸识别、自动驾驶、智能家居等“黑科技”早已成为...

Python燕大侠 ⋅ 05/15 ⋅ 0

他学习一年Python找不到工作,大佬都说你别再学Python了!

都说,滴水穿石非一日之功。然而有些人即使奋斗一辈子也比不上别人一年,别人学习一年比不得你学习一个月。其中缘由,有些人看了大半辈子还没看明白。 即使Python这么火,为何你学习一年的P...

柯西带你学编程 ⋅ 06/06 ⋅ 0

推荐几本对于Python初学者比较好的书籍(内含PDF)

我们提供一个初学者最好的Python书籍列表。Python是一个初级程序员可以学习编程的最友好语言之一。为了帮助您开始使用Python编程,我们分享此列表。泡一杯茶,选一本书阅读,开始使用Python编...

柯西带你学编程 ⋅ 06/08 ⋅ 0

给伸手党的福利:Python 新手入门引导

这是一篇 Python 入门指南,针对那些没有任何编程经验,从零开始学习 Python 的同学。不管你学习的出发点是兴趣驱动、拓展思维,还是工作需要、想要转行,都可以此文作为一个参考。 在这个信...

crossin ⋅ 06/15 ⋅ 0

学习Python必去的8个网站!

作为一个现时代的程序员初学者,除了看书之外,互联网的学习手段也是断不能少的! 以下这些网站,虽说不上全方位的满足你的需求,但是大部分也都能! 0.国外的大神GitHub : https://github...

W3Cschool ⋅ 06/14 ⋅ 0

5本必读Python入门书籍,你都看过吗?(附福利)

今天技术学派为大家准备了5本Python入门书籍,除了书籍小编还整理了3个常用的资源网站分享给大家。 1.Python基础教程 《Python基础教程》是经典的Python入门教程书籍,本书层次鲜明,结构严谨...

Python燕大侠 ⋅ 06/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

聊聊spring cloud netflix的HystrixCommands

序 本文主要研究一下spring cloud netflix的HystrixCommands。 maven <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部