python__系统 : 异步实现以及GIL

Posted cccy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python__系统 : 异步实现以及GIL相关的知识,希望对你有一定的参考价值。

创建进程的方式中有个 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的主要内容,如果未能解决你的问题,请参考以下文章

4月27日 python学习总结 GIL进程池线程池同步异步阻塞非阻塞

27 Apr 18 GIL 多进程多线程使用场景 线程互斥锁与GIL对比 基于多线程实现并发的套接字通信 进程池与线程池 同步异步阻塞非阻塞

Python3异步编程

python通过multiprocessing 实现带回调函数的异步调用的代码

『Python CoolBook』C扩展库_其六_线程

10.1python中的GIL