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():
print('-----%d---' %i)
time.sleep()
return 'haha' def test2(args):
print('----callback func---pid=%d' %os.getpid())
print('----callback func---args=%s' %args) if __name__ == '__main__': pool = Pool()
pool.apply_async(func=test, callback=test2) #回调 while True:
time.sleep()
print('---主进程-pid=%d---' %os.getpid())
主进程 一直在重复 print('---主进程-pid=%d---' %os.getpid()) 这一句话, 当子进程 执行完 test 之后,有个返回值 haha 然后主进程放下手中的工作去执行 test2 ,返回值就是传进去的参数 .这就是 callback 的作用. 结果:
>>>
--进程池里的进程---pid:,ppid:--
--------
---主进程-pid=---
--------
---主进程-pid=---
--------
---主进程-pid=---
----callback func---pid=
----callback func---args=haha
---主进程-pid=---
---主进程-pid=---
---主进程-pid=---
---主进程-pid=---
---主进程-pid=---
主进程不知道 test 什么时候执行完,什么时候给他返回值让他执行 test2 所以只能先做手中的工作 等到有返回值的时候才去执行 test2 这就是异步,
同步就是主进程一直等待,等到有返回值执行完test2 之后才做自己的工作.
GIL:全局解释器锁 . 有了它 python 里面的多线程 在多核cpu下就是伪多线程.所以一般都用c语言来编写多线程的关键性代码:
#c 语言中的死循环: void DeadLoop()
{
while()
{
;
}
}
如果这个文件名字是 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的更多相关文章
- python__系统 : 线程
线程之间,全局变量可以共享,但是局部变量依然是不共享的,线程的创建方式: threading.Thread(),还可以定义一个类继承Thread,重写他的run方法,具体和进程的写法一样. 那么,线程 ...
- python__系统 : 进程
在类unix操作系统下,可以用 os.fork() 创建一个新的进程,windows系统不可以: import os ret = os.fork() print('ret=%d' % ret) : p ...
- python__系统 : socket_TCP补充,协程
TCP 三次握手: SYN --> SYN+ACK --> ACK 四次挥手: FIN --> ACK (FIN) --> ACK TCP十种状态: LISTEN ...
- python__系统 : socket_TCP相关
tcp和udp对比起来.还是tcp相对稳定一些,但是因为有三次挥手和四次握手,以及确认包(ack)的存在,可能在速度上会比udp慢. 用python的socket模块可以建立tcp服务端: from ...
- python__系统 : socket_UDP相关
socket.socket() 可以创建一个套接字: from socket import * from threading import Thread udp_socket = None dest_ ...
- python__系统 : 线程池
参考文档: https://www.jianshu.com/p/b9b3d66aa0be 使用 ThreadPoolExecutor 类, as_completed 是迭代器, 如果有任务执行完 ...
- 分布式开放消息系统(RocketMQ)的原理与实践
分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一 ...
- android 异步加载框架 原理完全解析
一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...
- 门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结(转)
add by zhj:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群 ...
随机推荐
- Eclipse jee 3.7常用插件安装手记
最近在折腾Maven,于是想重新配置一个Eclipse环境,插件安装挺折腾人的,尤其天朝的网络,你懂的,伤不起啊,因此特地把正确的过程记录下来,供大家参考,节省时间 1.官网下载eclipse-jee ...
- jsp---tomcat===》》内置对象
1.内置对象: request: 方法:getParameter("txtName"):获取和页面上的name属性对象的value值 返回String ...
- Eclipse reference
http://download.csdn.net/download/ling_min/4318719 http://www.qualityeclipse.com/eclipse-gef http:// ...
- java.lang.OutOfMemoryError: Failed to allocate a 3110419 byte allocation with 741152 free bytes and
在进行SurfaceView的开发时,出现了java.lang.OutOfMemoryError错误: 由于项目是同时显示四路远端传输过来的视频 所以采用的方法是使用:android:hardware ...
- (转)两张Firefox OS 系统截图
锁屏图 锁屏就是一个向上的小火箭. 桌面 桌面又是另一种风格. 注意 以上为Android系统下运行b2g. 原文地址,TZone
- URL地址中中文乱码详解(javascript中encodeURI和decodeURI方法、java.net.URLDecoder.encode、java.net.URLDecoder.decode)
引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生了,该如何解决呢?且听本文详细道来. ...
- Redis 基础概念和命令
Redis 是什么 Redis是一种基于键值对(key-value)的NoSQL数据库. 为什么使用Redis 速度快 Redis的时间颗粒度一般是微秒,慢查询的默认值是10 000微秒,即10毫秒. ...
- 笨办法学Python(三十)
习题 30: Else 和 If 前一习题中你写了一些 “if 语句(if-statements)”,并且试图猜出它们是什么,以及实现的是什么功能.在你继续学习之前,我给你解释一下上一节的加分习题的答 ...
- selenium入门14 窗口切换
窗口切换: 当前窗口句柄 current_window_handle 所有的窗口句柄 window_handles 切换窗口 switch_to_window() #coding=utf-8 #切换窗 ...
- 使用extentreports美化testng报告2,增加监听
有兴趣研究了extentreports报告美化插件,但是因为发现插件有很多内容不能自定义,所以放弃了这个插件,我扩充了官方代码的demo,在testng中增加了监听,并打印了一些测试用例,现在我把两个 ...