zoukankan      html  css  js  c++  java
  • 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就管不到了,多核多线程的效率就高了.

  • 相关阅读:
    [Codeforces967C]Stairs and Elevators(二分查找)
    [Codeforces976E]Well played!(贪心)
    [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机+DP)
    [HDU2222]Keywords Search(AC自动机)
    [BZOJ1030][JSOI2007]文本生成器(AC自动机+DP)
    基于ZooKeeper实现——分布式锁与实现
    基于Redis实现——分布式锁与实现
    java 接口请求返回通用json
    Java SHAA加密
    (转)一些牛人榜样,多看看他们写的东西(后续整理牛人的blog等)
  • 原文地址:https://www.cnblogs.com/cccy0/p/9086061.html
Copyright © 2011-2022 走看看