博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python__系统 : 异步实现以及GIL
阅读量:6914 次
发布时间:2019-06-27

本文共 1555 字,大约阅读时间需要 5 分钟。

创建进程的方式中有个 callback ,也就是回调. 看代码:

from multiprocessing import Poolimport timeimport osdef 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 ctypesfrom threading import Threadlib = ctypes.cdll.LoadLibrary("./clib.so")t = Thread(target=lib.DeadLoop)t.start()while True:    pass

这样 把cpu密集型的 关键代码用c语言去写,那么python解释器 的GIL就管不到了,多核多线程的效率就高了.

转载于:https://www.cnblogs.com/cccy0/p/9086061.html

你可能感兴趣的文章
《嵌入式Linux基础教程(第2版)》——1.2 嵌入式Linux现状
查看>>
科普丨【计算机视觉】OpenCV中直方图处理函数简述
查看>>
《量化金融R语言初级教程》一2.3 使用真实数据
查看>>
《C++编程惯用法——高级程序员常用方法和技巧》——1.4 使用CRC卡片来辅助设计...
查看>>
《Adobe Flash CS6中文版经典教程》——1.10 修改内容和舞台
查看>>
《Python高手之路》——2.7 Christophe de Vienne访谈
查看>>
《iOS 6高级开发手册(第4版)》——1.10节秘诀:Core Motion基础
查看>>
《Ansible权威指南》一1.6 Ansible应用场景
查看>>
HTML超链接
查看>>
Netty知识笔记
查看>>
wampserver如何配置。
查看>>
架构的演进,阿里资深Java工程师表述架构的腐化之谜
查看>>
android中调用native的fork函数后的现象观察
查看>>
javascript模拟new的实现
查看>>
IDEA快捷键
查看>>
微信小程序模板介绍
查看>>
JDK源码阅读-Iterable接口
查看>>
【算法刷题】2:寻找两个有序数组的中位数
查看>>
Linux学习笔记(三)-Linux 磁盘与文件系统管理
查看>>
站在巨人的肩膀上
查看>>