资讯专栏INFORMATION COLUMN

Python进程专题2:multiprocessing创建进程

骞讳护 / 3136人阅读

摘要:类常用属性布尔值,指示进程是否是后台进程。当创建它的进程终止时,后台进程会自动终止。进程的整数退出指令。如果进程仍然在运行,它的值为,如果值为负数,就表示进程由信号所终止。

上一篇文章:Python进程专题1:fork():创建子进程、getpid()、getppid()
下一篇文章:Python进程专题3:继承Process来创建进程

由于fork()无法对Windows使用,而python是跨平台的,显然需要一个新的跨平台替代品来代替它,那就是multiprocessing模块。

multiprocessing模块中使用Process类来代表进程。

语法:Process([group,target,name,args,kwargs])
group:至今还未使用,值始终为None
target:进程实例所调用的对象,一般表示子进程要调用的函数。
args:表示调用对象的参数,一般是函数的参数
kwargs:表示调用对象的关键字参数字典。
name:当前进程实例的别名

Process类常用方法:

p.is_alive():判断进程是否还在运行。如果还在运行,返回true,否则返回false
p.join([timeout]):等待进程实例执行完毕,或等待多少秒
p.run():默认会调用target指定的对象,如果没有给定target参数,对该进程对象调用start()方法时,就会执行对象中的run()方法
p.start():启动进程实例(创建子进程),病运行子进城的run方法
p.terminate():不管任务是否完成,立即终止,同时不会进行任何的清理工作,如果进程p创建了它自己的子进程,这些进程就会
变成僵尸进程,使用时特别注意,如果p保存了一个锁或者参与了进程间通信,那么使用该方法终止它可能会导致死锁或者I/O损坏。

Process类常用属性:

p.daemon:布尔值,指示进程是否是后台进程。当创建它的进程终止时,后台进程会自动终止。并且,后台进程无法创建自己的新进城。
注意:p.daemon的值必须在p.start方法调用前设置。
p.exitcode:进程的整数退出指令。如果进程仍然在运行,它的值为None,如果值为负数:—N,就表示进程由信号N所终止。
p.name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数。
p.pid:当前进程实例的PID

实例1:理解多带带创建进程的相关函数

#该实例是用来理解多带带创建进程的实例
from multiprocessing import Process
import os,time

#将要在子进程中运行的方法
def test(name,interval):
    for i in range(interval):
        print("子进程运行中,name=%s,pid=%d,父进程:%d"%(name,os.getpid(),os.getppid()))
        time.sleep(interval)

if __name__=="__main__":
    print("父进程%d"%os.getpid())
    #创建进程实例,第一个参数传要在子线程执行的函数,第二个参数传函数需要的参数
    p=Process(target=test,args=("mark",2))
    print("子进程要执行了")
    #启动进程
    p.start()
    p.join()#等待子进程运行结束再继续执行下面语句
    print("子进程结束了")

结果:

父进程17756
子进程要执行了
子进程运行中,name=mark,pid=17758,父进程:17756
子进程运行中,name=mark,pid=17758,父进程:17756
子进程结束了

实例2:两个进程同时运行

from multiprocessing import Process
import os
import time

def test1(interval):
    print("test1子进程运行中,pid=%d,父进程:%d"%(os.getpid(),os.getppid()))
    t_start=time.time()
    time.sleep(interval)
    t_end=time.time()
    print("test1执行时间:%0.2f秒"%(t_end-t_start))


def test2(interval):
    print("test2子进程运行中,pid=%d,父进程:%d"%(os.getpid(),os.getppid()))
    t_start=time.time()
    time.sleep(interval)
    t_end=time.time()
    print("test2执行时间:%0.2f秒"%(t_end-t_start))

if __name__=="__main__":
    print("父进程%d"%os.getpid())
    #创建进程实例,第一个参数传要在子线程执行的函数,第二个参数传函数需要的参数
    p1=Process(target=test1,args=(1,))
    p2=Process(target=test2,name="mark1",args=(2,))
    #启动进程
    p1.start()
    p2.start()

    print("p2是否在运行:",p2.is_alive())

    p2.join()#等待子进程运行结束再继续执行下面语句
    print("p2是否在运行:", p2.is_alive())

结果:

父进程15080
p2是否在运行: True
test1子进程运行中,pid=15081,父进程:15080
test2子进程运行中,pid=15082,父进程:15080
test1执行时间:1.00秒
test2执行时间:2.00秒
p2是否在运行: False

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42359.html

相关文章

  • Python进程专题6:共享数据与同步

    摘要:可以使用标准的索引切片迭代操作访问它,其中每项操作均锁进程同步,对于字节字符串,还具有属性,可以把整个数组当做一个字符串进行访问。当所编写的程序必须一次性操作大量的数组项时,如果同时使用这种数据类型和用于同步的单独大的锁,性能将极大提升。 上一篇文章:Python进程专题5:进程间通信下一篇文章:Python进程专题7:托管对象 我们现在知道,进程之间彼此是孤立的,唯一通信的方式是队...

    Yuanf 评论0 收藏0
  • Python进程专题7:托管对象

    摘要:连接带远程管理器对象,该对象的地址在构造函数中支出。在当前进程中运行管理器服务器。启动一个单的子进程,并在该子进程中启动管理器服务器。如果无法序列号对象将引发异常。 上一篇文章:Python进程专题6:共享数据与同步下一篇文章:Python进程专题8:分布集群的消息传递 进程不支持共享对象,上面描述的创建共享值和数组,但都是指定的特殊类型,对高级的Python对象(如:字典、列表、用...

    DevYK 评论0 收藏0
  • Python进程专题4:进程池Pool

    摘要:上一篇文章进程专题继承来创建进程下一篇文章进程专题进程间通信当我们需要创建大量的进程时,利用模块提供的来创建进程。关闭进程池,不再接受进的进程请求,但已经接受的进程还是会继续执行。 上一篇文章:Python进程专题3:继承Process来创建进程下一篇文章:Python进程专题5:进程间通信 当我们需要创建大量的进程时,利用multiprocessing模块提供的Pool来创建进程。 ...

    Leo_chen 评论0 收藏0
  • Python进程专题5:进程间通信

    摘要:上一篇文章进程专题进程池下一篇文章进程专题共享数据与同步模块支持的进程间通信主要有两种管道和队列。队列底层使用管道和锁,同时运行支持线程讲队列中的数据传输到底层管道中,来实习进程间通信。 上一篇文章:Python进程专题4:进程池Pool下一篇文章:Python进程专题6:共享数据与同步 multiprocessing模块支持的进程间通信主要有两种:管道和队列。一般来说,发送较少的大...

    eccozhou 评论0 收藏0
  • Python进程专题3:继承Process来创建进程

    摘要:上一篇文章进程专题创建进程下一篇文章进程专题进程池实例重新方法下面一句是调用父类方法,这一本尽量不要少,因为父类还有很多事情需要在方法内处理重写方法子进程运行中,,父进程子进程运行结束,耗时秒父进程开始执行父进程运行结束,耗时秒结果父进 上一篇文章:Python进程专题2:multiprocessing创建进程下一篇文章:Python进程专题4:进程池Pool 实例: from mu...

    zxhaaa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<