创建进程的方式中有个 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的更多相关文章

  1. python__系统 : 线程

    线程之间,全局变量可以共享,但是局部变量依然是不共享的,线程的创建方式: threading.Thread(),还可以定义一个类继承Thread,重写他的run方法,具体和进程的写法一样. 那么,线程 ...

  2. python__系统 : 进程

    在类unix操作系统下,可以用 os.fork() 创建一个新的进程,windows系统不可以: import os ret = os.fork() print('ret=%d' % ret) : p ...

  3. python__系统 : socket_TCP补充,协程

    TCP 三次握手: SYN  -->  SYN+ACK  -->  ACK 四次挥手:  FIN --> ACK (FIN)  --> ACK TCP十种状态: LISTEN  ...

  4. python__系统 : socket_TCP相关

    tcp和udp对比起来.还是tcp相对稳定一些,但是因为有三次挥手和四次握手,以及确认包(ack)的存在,可能在速度上会比udp慢. 用python的socket模块可以建立tcp服务端: from ...

  5. python__系统 : socket_UDP相关

    socket.socket() 可以创建一个套接字: from socket import * from threading import Thread udp_socket = None dest_ ...

  6. python__系统 : 线程池

    参考文档: https://www.jianshu.com/p/b9b3d66aa0be 使用  ThreadPoolExecutor  类,  as_completed 是迭代器, 如果有任务执行完 ...

  7. 分布式开放消息系统(RocketMQ)的原理与实践

    分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一 ...

  8. android 异步加载框架 原理完全解析

    一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...

  9. 门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结(转)

    add by zhj:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群 ...

随机推荐

  1. Fastjson中以is打头出现的问题,会生成两个变量

    解决办法: @JSONField(name = "isSelf")public boolean isSelf = false; 这样就不会生成两个谜题 self和isSelf了 h ...

  2. dll托管于非托管

    托管的DLL组件可以在VS 直接添加引用,在使用using dll的文件命名空间就可以使用 非托管的DLL组件,只能通过using system.Runtime.InteropServices:引入 ...

  3. C#入门--索引器

    C#入门--索引器 索引器允许类或结构的实例按照与数组相同的方式进行索引.索引器类似于属性,不同之处在于它们的访问器采用参数. 索引器概述 索引器使得对象可按照与数组相似的方法进行索引. get 访问 ...

  4. php一种面向对象的语言,那么什么是面向对象呢?

    php一种面向对象的语言,那么什么是面向对象呢? 传统的面向过程的编程思想: 相信很多人第一次接触编程都是c语言,c语言就是非常典型的面向过程的编程语言,将要实现的功能描述为一个从开始到结束的连续的“ ...

  5. cf1059D. Nature Reserve(三分)

    题意 题目链接 Sol 欲哭无泪啊qwq....昨晚一定是智息了qwq 说一个和标算不一样做法吧.. 显然\(x\)轴是可以三分的,半径是可以二分的. 恭喜你获得了一个TLE的做法.. 然后第二维的二 ...

  6. css3照片墙

    一张张照片散乱的撒在一起,鼠标悬浮时旋转放大并摆正,效果如下图(所有图片均来自网络),主要使用到的css3属性有:transition.transform(scale.rotateZ).box-sha ...

  7. 基于Python的开源人脸识别库:离线识别率高达99.38%

    项目地址:https://github.com/ageitgey/face_recognition#face-recognition 本文的模型使用了C++工具箱dlib基于深度学习的最新人脸识别方法 ...

  8. 升级jdk注意事项

    最好使用和编译的jdk相同版本的jre去执行.class程序. 今天在本地模拟部署项目到tomcat6就遇到了个坑. 我们项目使用的jdk1.7开发的,编译打war包放到webapps后,启动报错Ex ...

  9. SonarQube代码质量管理平台介绍与搭建

    前 言 1.SonarQube的介绍 SonarQube是一个管理代码质量的开放平台. 可以从七个维度检测代码质量(为什么要用SonarQube): (1) 复杂度分布(complexity):代码复 ...

  10. 数组模拟栈(C语言)

    用数组模拟栈的实现: #include <stdio.h> #include <stdlib.h> #define STACK_SIZE 100 typedef struct ...