python之Process进程

python之进程

概述:

python进程是程序中执行的程序,每个进程都有自己的地址空间。

**进程:**资源分配的最小单位。**线程:**程序执行的最小单位。协程:协程完全由程序所控制

在电脑程序中一般进程>线程>协程,进程中可以包含多个线程,线程中可以包含多个协程。

在执行多进程或多线程的时候,当cpu有多个核心的时候,那么进程间或线程间就是并行的。当cpu只有一个核心的时候,那么那么进程间或线程间就是并发的。

并发和并行

并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间
再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其他线程处于挂起状。这种方式我们称之为并发

并行:当系统有一个以上CPU时,则线程操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占

Multiprocess.Process模块

process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

def task():
    print("task")
if __name__=="__main__":
    p = Process(target=task)		#注意不要调用成task()函数
    p.start()

Process的参数和方法

参数

group:表示线程组,默认为None

target:表示调用对象,子程序要执行的任务

args:表示调用位置的参数(要用元组)

kwargs:表示调用对象的字典

name:子进程多的名称

方法

**start:**启动子进程,调用默认的run()

**run:**表示进程的运行方式。

**name:**进程的名字

**terminate:**强制子程序终止进程

**is_alive:**判断子程序是否还存货

**daemon:**表示守护进程,默认值是False,当设置为Ture时,当父进程结束时,它会尝试终止其所有守护进程子。必须在start()之前设置。

**join([timeout]):**timeout默认值时None,该方法为阻塞,在调用join的子进程结束后才开始后面的代码,如果timeout有设定值,join会阻塞设定的时间才开始后面的代码

**pid:**返回进程的ID。用os模块的os.getppid()是返回主进程的ID,os.getpid()是返回当前进程的ID。

**exitcode:**进程在运行时为None、如果为–N,表示被信号N结束(了解即可)

示例:
import os
from multiprocessing import Process
import time

def task(args):
    print('子进程开始%s,子进程的id:%s和父id:%s'% (time.time(),os.getpid(),os.getppid()))
    time.sleep(args)
    print('子进程结束%s'%time.time())

if __name__=="__main__":
    p = Process(target=task,name="task",args=(1,))
    p.start()
    p.join()
    print("子进程结束",p.is_alive())
    print('主进程结束')

结果:

子进程开始1692500910.6039252,子进程的id:348和父id:12076
子进程结束1692500911.6121373			#sleep睡了三秒
子进程结束 False						#因为join,所以在子进程结束后才执行
主进程结束

自定义进程

自定义进程可以设定一个类继承父类Process,如果有默认属性要求,自己写的__init__(self)会将父类的__init__覆盖,为了不丢失父类的一些属性,需要用super()加载

注意:在自定义进程中,必须要有run()函数。

示例:
import os
import time
from multiprocessing import Process


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

    def run(self):		#run()是Process类专门留出来让你重写的接口函数
        self.task1()
        self.task2()

    def task1(self):
        print("task1" + '子进程开始%s,子进程的id:%s和父id:%s' % (time.time(), os.getpid(), os.getppid()))

    def task2(self):
        print("task2" + '子进程开始%s,子进程的id:%s和父id:%s' % (time.time(), os.getpid(), os.getppid()))


if __name__ == "__main__":
    p = MyProcess(2)
    p.start()
    p.join()
    print('主进程结束')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值