1. 程式人生 > >python__系統 : 異步實現以及GIL

python__系統 : 異步實現以及GIL

一句話 port types call 參數 import AR python pool

創建進程的方式中有個 callback ,也就是回調. 看代碼:

from multiprocessing import Pool
import time
import os

def test():
    print(--進程池裏的進程---pid:%d,ppid:%d-- %(os.getpid(), os.getpid()))
    for i in range(3):
        print(-----%d--- %i)
        time.sleep(1)
    return haha

def test2(args):
    print(----callback func---pid=%d
%os.getpid()) print(----callback func---args=%s %args) if __name__ == __main__: pool = Pool(3) pool.apply_async(func=test, callback=test2) #回調 while True: time.sleep(1) print(---主進程-pid=%d--- %os.getpid())

主進程 一直在重復 print(‘---主進程-pid=%d---‘ %os.getpid()) 這一句話, 當子進程 執行完 test 之後,有個返回值 haha 然後主進程放下手中的工作去執行 test2 ,返回值就是傳進去的參數 .這就是 callback 的作用. 結果:

>>>
--進程池裏的進程---pid:7468,ppid:7468-- -----0--- ---主進程-pid=9524--- -----1--- ---主進程-pid=9524--- -----2--- ---主進程-pid=9524--- ----callback func---pid=9524 ----callback func---args=haha ---主進程-pid=9524--- ---主進程-pid=9524--- ---主進程-pid=9524--- ---主進程-pid=9524--- ---主進程-pid=9524---

主進程不知道 test 什麽時候執行完,什麽時候給他返回值讓他執行 test2 所以只能先做手中的工作 等到有返回值的時候才去執行 test2 這就是異步,

同步就是主進程一直等待,等到有返回值執行完test2 之後才做自己的工作.

GIL:全局解釋器鎖 . 有了它 python 裏面的多線程 在多核cpu下就是偽多線程.所以一般都用c語言來編寫多線程的關鍵性代碼:

#c 語言中的死循環:

void DeadLoop()
{
        while(1)
        {
                ;
        }
}

如果這個文件名字是 loop.c 那麽這樣編譯:

gcc loop.c -shared -o clib.so

然後就生成了一個 clib.so 文件 ,在 py文件裏這麽寫:

import ctypes
from threading import Thread

lib = ctypes.cdll.LoadLibrary("./clib.so")

t = Thread(target=lib.DeadLoop)
t.start()

while True:
    pass

這樣 把cpu密集型的 關鍵代碼用c語言去寫,那麽python解釋器 的GIL就管不到了,多核多線程的效率就高了.

python__系統 : 異步實現以及GIL