python__系统 : 异步实现以及GIL
2018-06-18 03:05:43来源:未知 阅读 ()
创建进程的方式中有个 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就管不到了,多核多线程的效率就高了.
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash