• 自学Python 56 多线程开发(六)使用 Process


    ​Python 使用 Process

    活动地址:CSDN21天学习挑战赛



      本文在多线程开发(五)使用进程库multiprocessing的基础上继学习multiprocessing模块中的内容。


    一、使用 Process

      在Python的multiprocessing模块中,通过创建Process对象,然后调用其start() 方法来生成进程。在类Process中包含如下所示的内置成员:
      (1) multiprocessing.Process(group=Nore,target=None, name=None, args=(), kwargs={},* , daemo=None): 进程对象表示在单独进程中运行的活动。参数说明如下表所示。类Process具有类threading.Thread中的所有同名方法的功能。在Python 中,应始终使用关键字参数调用这个构造函数。

    参数名称描述
    group应始终为None, 仅仅与treding.Thread 兼容
    target是由run()方法调用的可调用对象,默认值为None, 表示不调用任何内容
    name是进程名称
    args是目标调用的参数元组
    kwargs是目标调用的关键学参数的字典,如果提供此参数值,则将关键进程daemon标记设置为True或False
    daemon如果将daemon标记设置为None (默认值),则此标志将从创建过程继承

      如果一个子类覆盖了构造方法,则必须确保在对进程做任何其他事情之前调用基类构造方法(Process. init ())。
      (2) daemon: 进程的守护标志,是一个布尔值,必须在调用start() 之前设置。
      (3) pid: 返回进程ID,在生成进程之前是None。
      (4) exitcode: 子进程的退出代码。如果进程尚未终止则是None,负值-N则表示子进程被信号N终止。
      (5) authkey: 进程的认证密钥(字节字符串)。当初始化multiprocessing时,使用os.urandom()为主进程分配一个随机字符串;当创建Process对象时,将继承其父进程的认证密钥,但以通过将authkey设置为另一个字节字符串来更改。
      (6) sentinel: 系统对象的数字句柄,在进程结束时将变为“就绪”。当使用multiprocessing.connection.wait()一次等待多个事件建议使用此值,否则调用join()将更简单。在Windows系统中,这时可与WaitForSingleObject和WaitForMultipleObjects API调用系列一起使用的操作系统句柄。在Unix系统中,这是一-个文件描述器,可以使用来自select模块的原语。
      (7) terminate(): 终止进程。在Unix系统中,是使用SIGTERM信号完成的;在Windows系统中使用TerminateProcess()。注意,退出处理程序和finally子句等不会被执行。
      例如下面的实例演示了使用Process对象生成进程的过程。

    import os
    import threading
    import multiprocessing
    
    def worker(sign, lock):
        lock.acquire()
        print(sign,os.getpid())
        lock.release()
    print('Main:',os.getpid())
    record = []
    lock = threading.Lock()
    for i in range(5):
        thread = threading.Thread(target=worker,args=('thread',lock))
        thread.start()
        record.append(thread)
    for thread in record:
        thread.join()
    record = []
    lock = multiprocessing.Lock()
    for i in range(5):
        process = multiprocessing.Process(target=worker,args=('process',lock))
        process.start()
        record.append(process)
    for process in record:
        process.join()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

      通过上述代码可以看出,Thread 对象和Proces对象在使用上的相似性与结果上的不同。各个线程和进程都做一件事: 打印PID。但问题是所有的任务在打印的时候都会向同一个标准输出(stdout) 。这样输出的字符会混合在一起,无法阅读。使用Lock同步,在一个任务输出完成之后,再允许另个任务输出, 可以避免多个任务同时向终端输出。所有Thread的PID都与主程序相同,而每个Process都有一个不同的PID。执行后会输出:
    在这里插入图片描述

    …省略部分执行效果

  • 相关阅读:
    292.Nim游戏 | 877.石子游戏 | 319.灯泡开关
    【PyTorch】深度学习实践之 用PyTorch实现线性回归 Linear Regression with Pytorch
    AWS认证SAA-C03每日一题
    HTML制作一个汽车介绍网站【大学生网页制作期末作业】
    手把手教你部署Jenkins教程,小白也能学会(多图预警)!
    Linux-----nginx的简介,nginx搭载负载均衡以及nginx部署前后端分离项目
    站在开源云的新周期,EasyStack布局数字原生企业云
    【前端性能优化指南】首屏加载优化、内存泄漏、CSS页面性能优化、CSS Sprites等
    P04 Navicat 15 安装使用
    在 Net7.0环境下通过反射创建对象和调用方法
  • 原文地址:https://blog.csdn.net/weixin_46066007/article/details/126445020