话不多说,直接上代码:

import time
from functools import partial
from concurrent.futures.process import ProcessPoolExecutor # 异步回调需要加锁吗?
"""
疑问来源,在做数据分析时,为了提高程序速度,使用了进程池,并为了汇总每个进程处理的结果,使用到回调函数,
我的回调函数中需要对数据进行修改,因此不得不考虑数据安全问题。
按照我的想法:回调在进程执行完毕之后才发生,此时已经不在是并发了,那么就不会有数据安全问题,无需加锁。
但是稳妥起见,还是测试一波。
我建立了下面这个demo1,在回调的时候特地sleep2秒,然后计算程序运行总时间,根据打印结果,一共花费8秒多,
显然在处理回调函数pring_n的时候程序时同步执行的,那么自然无需加锁。
那么执行回调函数print_n的顺序是怎样的呢?是按照对应的进程结束时间调用的吗?根据源码注释:
These callables are called in the order that they were added(回调函数按照他们被添加的顺序调用)
也就是说回调函数调用顺序跟他所在进程被添加顺序一致,而非按照他所在的进程的结束时间执行。
为了验证这一点,我做了demo2,将第二个进程(i为1)sleep更长时间,从结果来看,和demo1顺序一致,
"1经过计算后的结果是1"并未在最后打印,证实了源码说法。
""" # demo1
# def count():
# for i in range(4):
# yield i
#
#
# def print_n(i, ret, obj):
# print(f'{i}经过计算后的结果是{obj.result()}')
# ret.append(obj.result())
# time.sleep(2)
#
#
# def do_calc(i):
# return i ** 2
#
#
# if __name__ == '__main__':
# s = time.time()
# l = Lock()
# pool = ProcessPoolExecutor(4)
# ret = []
# for i in range(4):
# pool.submit(do_calc, i).add_done_callback(partial(print_n, i, ret))
# pool.shutdown(wait=True)
# print('end', time.time() -s)
# print('计算结果', ret) # demo2
def count():
for i in range(4):
yield i def print_n(i, ret, obj):
print(f'{i}经过计算后的结果是{obj.result()}')
ret.append(obj.result())
if i == 1:
time.sleep(4) def do_calc(i):
return i ** 2 if __name__ == '__main__':
s = time.time()
pool = ProcessPoolExecutor(4)
ret = []
for i in range(4):
pool.submit(do_calc, i).add_done_callback(partial(print_n, i, ret))
pool.shutdown(wait=True)
print('end', time.time() -s)
print('计算结果', ret)

代码运行结果我没有打印出来,大家可以copy一下运行。

另外,python中很多并发库都支持回调机制,大家感兴趣可以试验一下,增强对并发的理解。

python异步回调顺序?是否加锁?的更多相关文章

  1. 跨平台python异步回调机制实现和使用方法

    跨平台python异步回调机制实现和使用方法 这篇文章主要介绍了python异步回调机制的实现方法,提供了使用方法代码 1 将下面代码拷贝到一个文件,命名为asyncore.py 代码如下: impo ...

  2. python异步回调函数的实现

    #coding:utf-8 from socket import * import time #简单的服务器程序 监听用户连接,接收用户发来的信息,并返回反馈 def main(): HOST = & ...

  3. Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程

    Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...

  4. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  5. (转)python异步编程--回调模型(selectors模块)

    原文:https://www.cnblogs.com/zzzlw/p/9384308.html#top 目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分 ...

  6. python异步编程--回调模型(selectors模块)

    目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分析 3.1 注册 3.2 注销 3.3 查询 4. 别名 5. 总结 6. 代码报错问题 1. 文件描述 ...

  7. State Threads——异步回调的线性实现

    State Threads——异步回调的线性实现 原文链接:http://coolshell.cn/articles/12012.html 本文的标题看起来有点拗口,其实State Threads库就 ...

  8. 深入理解 Python 异步编程(上)

    http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...

  9. day37 异步回调和协程

    异步回调 """ 异步任务使用场景 爬虫 1.从目标站点下载网页数据 本质就是HTML格式字符串 2.用re从字符串中提取出你需要的数据 ""&quo ...

随机推荐

  1. 【译】理解Rust中的Futures (一)

    原文标题:Understanding Futures In Rust -- Part 1 原文链接:https://www.viget.com/articles/understanding-futur ...

  2. 解决IDEA Maven下载依赖包速度慢问题

    右键项目,maven选项,"Open setting.xml"或"Create setting.xml",在 mirrors 节点添加下面代码. <mir ...

  3. Windows单机安装hadoop

    版本信息 Hadoop 3.2.0 java version "1.8.0_201" Windows 7专业版,64位 安装过程 jdk安装 下载jdk,解压到目录,D:\Java ...

  4. [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵

    今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...

  5. 个人微信公众号搭建Python实现 -个人公众号搭建-被动回复消息建模(14.3.2)

    @ 目录 1.阅读官方文档 2.思考 关于作者 1.阅读官方文档 点击进入微信官方开发者文档 接收普通消息 文本消息 图片消息 语言消息 视频消息 小视频消息 地理位置消息 链接消息 接收事件消息 关 ...

  6. Python科学计算库Numpy

    Python科学计算库Numpy NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 1.简 ...

  7. 闲鱼上哪些商品抢手?Python 分析后告诉你

    1目 标 场 景 经常看到有朋友在闲鱼卖些小东西又或是自己擅长的一些技能,都能为他们带来不错的 睡后收入. 闲鱼上大量的商品,很难精准判断哪些受欢迎,哪些好卖:一个个录入数据去做数据分析,浪费时间的同 ...

  8. matlab练习程序(正态分布贝叶斯分类)

    clear all;close all;clc; randn('seed',0);mu1=[0 0];S1=[0.3 0;0 0.35];cls1_data=mvnrnd(mu1,S1,1000);p ...

  9. Spring Cloud 2020.0.0 正式发布,全新颠覆性版本!

    Spring Cloud 2020.0.0 没错,Spring Cloud 2020.0.0 正式发布了: 感谢Java技术栈群友通知,想入群的在公众号Java技术栈后台回复:wx,正在使用 Spri ...

  10. NET Core 使用EF Core的Code First迁移和DBFirst

    DBFirst (1)Microsoft.EntityFrameworkCore (2)Microsoft.EntityFrameworkCore.Design (3)Microsoft.Entity ...