一、创建进程的两种方式

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