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:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群 ...
随机推荐
- c# 小数点格式化
1.只要求保留N位不四舍5入 float f = 0.55555f; int i =(int)(f * 100); f = (float)(i*1.0)/100 ...
- 关于EasyUI datagrid 表头居中 数据列内容居右 或者居左
cell.css("text-align",(col.halign||col.align||"")); 这里有个属性挺眼熟 : col.align 前面还有一个 ...
- AWS的redhat7中安装jdk8
下载jdk8 wget https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/ ...
- Socket网络通信之NIO
Socket网络通信之NIO NIO:new io ,java1.4开始推出的可非阻塞IO. java.nio 包,可解决BIO阻塞的不足 但比BIO学习.使用复杂. 可以以阻塞.非阻塞两种方式工作. ...
- Java反射破坏单例模式
今天电话面试的时候问到了,Google了一下 原出处: http://blog.csdn.net/lws332969674/article/details/8125893 一. Java中的反射技术可 ...
- Redis数据类型之散列类型hash
在redis中用的最多的就是hash和string类型. 问题 假设有User对象以JSON序列化的形式存储到redis中, User对象有id.username.password.age.name等 ...
- 关于css实现单行、多行省略标记
实现单行: overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 实现多行: display: -webkit-box; -we ...
- [一个小问题]Mainfest配置文件的version问题小结
问题起源自己安装好产品的新build,然后用自己本地编译出来的其中一个DLL去替换到产品中,本来以为可以正常执行,但是却发现这个新DLL无法被Load,无法被使用. 从Event Viewer里找到了 ...
- MVC:控制器名与被调用模型名称发生冲突的解决方案
控制器名与被调用的模型名发生了冲突: 有两种解决方案: (1)将被调用的模型类名进行修改 例如: (2)对被调用的模型进行起一个别名 以上 加油ヾ(◍°∇°◍)ノ゙
- 使用ABAP(ADBC)和Java(JDBC)连接SAP HANA数据库
在表DBCON里维护一条记录,指向HANA数据库.con_ENV里填入HANA数据库的主机名和端口号.如vmXXXX:30015 DATA: ls_new TYPE DBCON. ls_new-con ...