• python----进程


    一、创建进程的两种方式

    1.1 普通创建

     Process([group[,target[,name[,args[,kwargs]]]]]) ,由该实例化得到的对象,
    表示一个子进程的任务(尚未启动)

    注意(参数介绍):
    1.需要使用关键字参数的方式来指定参数
    2.args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
    3.group参数为使用,值始终未None
    4.target表示调用对象,即子进程要执行的任务
    5.args表示调用对象的字典,kwargs={"name_":"json","age":19}
    6.name为子进程的名字
    方法介绍:
    1.p.start():启动进程,并调用该子进程中的p.run()方法
    2.p.run():进程启动时运行的方法,正是它去调用target指定的函数,
    我们自定义类的类中一定要实现该方法
    3.p.terminate():强制终止进程p,不会进行任何清理操作
    4.p.is_alive():如果仍然运行,返回True
    5.p.join(timeout):主进程等待p终止(注意:主进程处于等的状态,而p
    是处于运行的状态)timeout是可选的超出时间,需要强调的是p.join只能join
    主start开启的进程,而不能join住run开启的进程.

    1.2 类式创建

    from multiprocessing import Process,Queue
    import time
    
    class Myprocess(Process):
        def __init__(self):
            super(Myprocess,self).__init__()
    
        def run(self):
            time.sleep(2)
            print(self.name,time.ctime())
    if __name__ == '__main__':
        list = []
        for i in range(3):
            m = Myprocess()
            list.append(m)
            m.start()
        for a in list:
    
            a.join()

    二、进程间的通信

    2.1 通过队列

    这个multiprocessing.Queue是属于进程的,而之前曾经学习过的queue模块则是属于线程的,在这里不适用

    from multiprocessing import Process,Queue
    import time
    class Myprocess(Process):
        def __init__(self,q,n):
            super(Myprocess,self).__init__()
            self.q = q
            self.n = n
    
        def run(self):
            time.sleep(2)
            self.q.put(['hello',self.n,id(self.q)])
    
    if __name__ == '__main__':
        list = []
        q = Queue()
        print('main_id:',id(q))
        for i in range(3):
            m = Myprocess(q,i)
            list.append(m)
            m.start()
        print(q.get())
        print(q.get())
        print(q.get())
        for a in list:
            a.join()

    运行结果:

    main_id: 1896093746176
    ['hello', 0, 2431766385104]
    ['hello', 1, 2380120477992]
    ['hello', 2, 1310696559000]

    2.2 通过管道

    主进程与子进程之间的通信

    class myprocess(Process):
        def __init__(self,cnn):
            Process.__init__(self)
            self.cnn = cnn
    
        def run(self):
            print(self.cnn.recv())
            self.cnn.send('hello,i am subprocess:%s'%id(self))
            self.cnn.close()
    
    if __name__ == '__main__':
        parant_cnn,child_cnn = Pipe()#创建管道
        p = myprocess(child_cnn)#创建子进程
        p1 = myprocess(child_cnn)#创建子进程1
        p.start()
        p1.start()
        #主进程发送数据,子进程接收,再发送
        parant_cnn.send('nice to meet you,i am the main process')
        parant_cnn.send('nice to meet you,i am the main process')
        print(parant_cnn.recv())
        print(parant_cnn.recv())

    运行结果:

    nice to meet you,i am the main process
    hello,i am subprocess:2535314083400
    nice to meet you,i am the main process
    hello,i am subprocess:2157773246024

  • 相关阅读:
    使SourceInsight支持Python语言的方法
    图解Join
    EularProject 42:单词解码出来的三角形数
    android-async-http二次封装和调用
    #20 Valid Parentheses
    udev详解【转】
    linux下udev简介【转】
    Linux USB 驱动开发(一)—— USB设备基础概念【转】
    Android updater-scripts(Edify Script)各函数详细说明【转】
    OTA制作及升级过程笔记【转】
  • 原文地址:https://www.cnblogs.com/yujin123456/p/9957867.html
Copyright © 2020-2023  润新知