当前位置: 首页 > news >正文

PYTHON——多进程:概念

一、多进程的概念

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

  multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。

但在使用这些共享API的时候,我们要注意以下几点:

  • 在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie)。所以,有必要对每个Process对象调用join()方法 (实际上等同于wait)。对于多线程来说,由于只有一个进程,所以不存在此必要性。
  • multiprocessing提供了threading包中没有的IPC(比如Pipe和Queue),效率上更高。应优先考虑Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式 (因为它们占据的不是用户进程的资源)。
  • 多进程应该避免共享资源。在多线程中,我们可以比较容易地共享资源,比如使用全局变量或者传递参数。在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过共享内存和Manager的方法来共享资源。但这样做提高了程序的复杂度,并因为同步的需要而降低了程序的效率。

Process.PID中保存有PID,如果进程还没有start(),则PID为None。

window系统下,需要注意的是要想启动一个子进程,必须加上那句if __name__ == "main",进程相关的要写在这句下面。

二、创建进程的两种方法之二:函数式调用:

实例(函数式调用):

from multiprocessing import Process
import time
def f(name):
    time.sleep(1)
    print('hello', name,time.ctime())

if __name__ == '__main__':
    p_list=[]
    for i in range(3):
        p = Process(target=f, args=('alvin',))
        p_list.append(p)
        p.start()
    for i in p_list:
        p.join()
    print('end')

二、创建进程的两种方法之一:类式调用:

实例:类式调用:

from multiprocessing import Process
import time

class MyProcess(Process):
    def __init__(self):
        super(MyProcess, self).__init__()
        #self.name = name

    def run(self):
        time.sleep(1)
        print ('hello', self.name,time.ctime())


if __name__ == '__main__':
    p_list=[]
    for i in range(3):
        p = MyProcess()
        p.start()
        p_list.append(p)

    for p in p_list:
        p.join()

    print('end')

为了显示涉及的各个进程ID,这里是一个扩展的例子:

from multiprocessing import Process
import os
import time
def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())


def f(name):
    info('\033[31;1mfunction f\033[0m')  #在控制台中显示时,字体颜色编程亮绿色
    print('hello', name)  

if __name__ == '__main__':
    info('\033[32;1mmain process line\033[0m')
    time.sleep(100)
    p = Process(target=info, args=('bob',))
    p.start()
    p.join()

 实行结果:

main process line
module name: __main__
parent process: 20512
process id: 161076
bob
module name: __mp_main__
parent process: 161076
process id: 161160

 

转载于:https://www.cnblogs.com/chenhaiming/p/9919119.html

相关文章:

  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Python爬取新浪微博用户信息及微博内容
  • IIS7应用程序池集成和经典的区别
  • Es学习第二课, ES安装和客户端使用
  • EOS源码解析 eosio账号默认合约
  • 项目总结11:Centos部署JDK+Tomcat+MySQL文档(阿里云-网易云-华为云)
  • Oracle Procedure模板
  • 扫呗扫码点餐,如何在扫呗后台给这个商户配一下支付授权地址
  • 外网访问内网Resin
  • Jquery添加元素(append,prepend,after,before四种方法区别对比)
  • 面向对象类的解析
  • 关于Android全面屏虚拟导航栏的适配总结
  • 89元尝鲜智能家居 天猫精灵方糖智联3件套简评
  • Redis命令——哈希(Hash)
  • Material Design 设计规范总结(1)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【EOS】Cleos基础
  • 【个人向】《HTTP图解》阅后小结
  • 78. Subsets
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6简单总结(搭配简单的讲解和小案例)
  • gcc介绍及安装
  • Javascript设计模式学习之Observer(观察者)模式
  • js对象的深浅拷贝
  • Redis字符串类型内部编码剖析
  • Xmanager 远程桌面 CentOS 7
  • Yeoman_Bower_Grunt
  • 闭包--闭包之tab栏切换(四)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 成为一名优秀的Developer的书单
  • 关于for循环的简单归纳
  • 为视图添加丝滑的水波纹
  • ​VRRP 虚拟路由冗余协议(华为)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (七)Java对象在Hibernate持久化层的状态
  • (推荐)叮当——中文语音对话机器人
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net core 6.0 升8.0
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET和.COM和.CN域名区别
  • .Net小白的大学四年,内含面经
  • @font-face 用字体画图标
  • [4.9福建四校联考]
  • [Android] Upload package to device fails #2720
  • [C++]拼图游戏
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍