day10 消息隊列,多進程和多線程以及協程,異步IO,事件驅動等

回顧一下線程和進程python

 

線程與進程的區別windows

 

 

守護線程:多線程

隊列:app

兩種方式:async

先進先出  #
後入先出   #賣水果,後來的來的是新的

 

 生產者消費者模型:spa

生產包子,線程

吃包子3d

 

事件 event:blog

紅綠燈模型隊列

 

何時須要多線程:

 

多進程:

能夠起8個進程,每一個進程起一個線程,就能夠利用多核運算,缺點就是進程之間不能共享數據。

例子:

 

每個子進程都有一個父進程啓動:

 

from multiprocessing import Process
import os


def info(title):
    print(title)
    print('module name:', __name__)
    print('parent process:', os.getppid())
    print('process id:', os.getpid())
    print("\n\n")


def f(name):
    info('\033[31;1mcalled from child process function f\033[0m')
    print('hello', name)

if __name__ == '__main__':
    info('\033[32;1mmain process line\033[0m')
    p = Process(target=f, args=('bob',))
    p.start()

消息隊列:
線程之間通信:

 

進程間通訊:

實踐進程q

from multiprocessing import Process,Queue

def f(qq):
    qq.put(['yang',12,'hehe'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f,args=(q,))
    p.start()
    print(q.get())

 

 

 
線程q:

 

管道
感受和消息隊列差很少

 

 

實踐:

from multiprocessing import Process, Pipe


def f(conn):
    conn.send([42, None, 'hello from child'])
    conn.send([42, None, 'hello from child2'])
    print("from parent:",conn.recv())
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())  # prints "[42, None, 'hello']"
    print(parent_conn.recv())  # prints "[42, None, 'hello']"
    parent_conn.send("張洋可好") # prints "[42, None, 'hello']"
    p.join()

 

 

 

 

進程之間數據的真正共享:

 

 

 

 實踐,進程間共享數據:

from multiprocessing import Process,Manager
import os

def f(dic,list):
    dic[os.getpid()] = os.getpid()
    list.append(os.getpid())
    print(list)

if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()
        l = manager.list(range(5))
        p_list = []
        for i in range(10):
            p = Process(target=f,args=(d,l))
            p.start()
            p_list.append(p)
        for res in p_list:
            res.join()
        print(d)
        print(l)

 

  multiprocess
Queue  \ Pipe 只是實現進程間數據的傳遞
Manager 實現了進程間數據的共享,即多個進程能夠修改同一份數據 

 

這裏有個坑:

windows  多進程 必須加

否則會報錯

 

做用:
 
if  __name__ == '__main__':
 
會檢查是不是主動運行,又或者是其餘程序調用
 
若是調用,就不會執行 if  __name__ == '__main__':  後面的代碼
若是是手動執行,就會正常執行

 

進程池: 

進城池有兩種方法:

apply             串行
applu_async   並行
相關文章
相關標籤/搜索