1. 程式人生 > 實用技巧 >Python 多程序_通訊

Python 多程序_通訊

1. 多程序佇列 , 只能實現資料互動,不能共享

from multiprocessing import Process,Queue
import time
import  uuid

class MyProcess(Process):

    def __init__(self,q):
        super(MyProcess,self).__init__()
        self.q=q

    def run(self):
        self.q.put(uuid.uuid1())

if __name__ == '__main__':

    q=Queue()  #
程序佇列 """由於每個程序都是獨立的空間,所以必須將一個佇列傳入到每個程序裡面共享""" p = MyProcess(q) p2= MyProcess(q) p.start() p2.start() print(q.get()) print(q.get())

2. 雙向管道,只能實現資料互動,不能共享

from multiprocessing import Process,Queue,Pipe
import time
import  uuid


class MyProcess(Process):

    def __init__
(self,conn): super(MyProcess,self).__init__() self.conn=conn def run(self): self.conn.send('hello') data=self.conn.recv() # 沒有 send之前阻塞 print(data) if __name__ == '__main__': conn1,conn2=Pipe() # 管道 """由於每個程序都是獨立的空間,所以必須將一個佇列傳入到每個程序裡面共享""" p
= MyProcess(conn1) p.start() #====================================== data = conn2.recv() # 沒有 send之前阻塞 print(data) conn2.send('ok')

3. Managers, 支援資料共享

from multiprocessing import Process,Queue,Pipe,Manager
import time
import  uuid


class MyProcess(Process):

    def __init__(self,dic,li,num):
        super(MyProcess,self).__init__()
        self.dic=dic
        self.li=li
        self.num=num

    def run(self):
        self.dic['num%s'%self.num]=self.num
        self.li.append(self.num)

if __name__ == '__main__':

    with Manager() as manager:
        dic=manager.dict()  # 建立多程序共享字典
        li =manager.list()  # 建立多程序共享列表

        process_list=[]

        for i  in range(5):
            p=MyProcess(dic,li,i)
            p.start()
            process_list.append(p)

        for p in process_list:
            p.join()

        print(dic)
        print(li)

4.

5.

6.

7.

8.

9.