美文网首页
进程的创建

进程的创建

作者: furuiyang | 来源:发表于2018-04-27 20:46 被阅读0次

    进程的创建-multiprocessing

    multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。

    两个while循环一起执行的代码实现

    from multiprocessing import  Process
    import time
    
    def run_proc():
        '''子进程要执行的代码'''
        while True:
            print("---2---")
            time.sleep(1)
    
    if __name__ == '__main__':
        p = Process(target=run_proc)
        p.start()
        while True:
            print("---1---")
            time.sleep(1)
    

    代码说明

    创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动

    进程pid

    import multiprocessing
    import os
    import time
    
    def run_proc():
        # os.getpid() 取得当前进程的id
        # os.getppid() :取得当前进程的父进程的id
        while True:
            time.sleep(1)
            print()
            print("--run_proc--子进程的父进程的id=%d   子进程的id= %d" % (os.getppid(), os.getpid()))
    
    if __name__ == '__main__':
        print("--main--主进程的父进程id=%d   主进程的id= %d" % (os.getppid(), os.getpid()))
        p1 = multiprocessing.Process(target=run_proc)
        p1.start()
    
    进程id.png

    Process语法结构如下

    Process([group [, target [, name [, args [, kwargs]]]]])

    target:如果传递了函数的引用,可以认为这个子进程就执行这里的代码
    args:给target指定的函数传递的参数,以元组的方式传递
    kwargs:给target指定的函数传递命名参数
    name:给进程设定一个名字,可以不设定
    group:指定进程组,大多数情况下用不到

    Process创建的实例对象的常用方法:

    start():启动子进程实例(创建子进程)
    is_alive():判断进程子进程是否还在活着
    join([timeout]):是否等待子进程执行结束,或等待多少秒

    join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。

    terminate():不管任务是否完成,立即终止子进程

    Process创建的实例对象的常用属性:

    name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
    pid:当前进程的pid(进程号)

    给子进程指定的函数传递参数

    # coding:utf-8
    from multiprocessing import Process
    import os
    from time import sleep
    
    def run_proc(name,age,**kwargs):
        for i in range(10):
            print('子进程运行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid()))
            print(kwargs)
            sleep(0.2)
    
    if __name__ == '__main__':
        p = Process(target=run_proc,args=('test',18),kwargs={"m":20})
        p.start()
        sleep(1) # 1s之后 立即结束子进程
        p.terminate()
        p.join()
    

    运行结果

    进程传参运行结果.png

    进程之间不同享全局变量

    # coding:utf-8
    from multiprocessing import Process
    import os
    import time
    
    nums = [11,22]
    
    def work1():
        print('in process1 pid=%d,nums=%s' %(os.getpid(),nums))
        for i in range(3):
            nums.append(i)
            time.sleep(1)
            print('in process1 pid=%d,nums=%s' %(os.getpid(),nums))
    
    def work2():
        print('in process2 pid=%d,nums=%s'%(os.getpid(),nums))
        
    if __name__ == '__main__':
        p1 = Process(target=work1)
        p1.start()
        p1.join()
    
        p2 = Process(target=work2)
        p2.start()
    

    运行结果:

    /home/python/.virtualenvs/django_py3/bin/python /home/python/Desktop/demo/process_demo/demo004.py
    in process1 pid=15096,nums=[11, 22]
    in process1 pid=15096,nums=[11, 22, 0]
    in process1 pid=15096,nums=[11, 22, 0, 1]
    in process1 pid=15096,nums=[11, 22, 0, 1, 2]
    in process2 pid=15102,nums=[11, 22]
    
    Process finished with exit code 0
    

    相关文章

      网友评论

          本文标题:进程的创建

          本文链接:https://www.haomeiwen.com/subject/blvilftx.html