Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >同步调用与异步调用

同步调用与异步调用

作者头像
全栈程序员站长
发布于 2022-09-08 02:21:00
发布于 2022-09-08 02:21:00
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

同步调用和异步调用是两种提交任务的方式

同步调用:提交完任务后,就在原地等待任务执行完毕,拿到运行结果/返回值后再执行下一步,同步调用下任务是串行执行。

异步调用:提交完任务后,不会再原地等待任务执行完毕,直接执行下一行代码,异步调用时并发执行。

异步调用,几乎同时下达任务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from concurrent.futures import ProcessPoolExecutor
import os, time,random



def task(x):
    print("%s is running" % os.getpid())
    time.sleep(random.randint(1,3))
    return x**2

if __name__=="__main__":
    p = ProcessPoolExecutor()
    futures = []
    for i in range(10):
        future = p.submit(task,i)#返回计算结果
        futures.append(future)
    p.shutdown(wait=True)#默认waiti为True 等待十个进程任务执行完,关闭进程池的入口。
    for future in futures:
        print(future.result())
    print("主")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
结果为:

10760 is running
10564 is running
12848 is running
3928 is running
10564 is running
12848 is running
10760 is running
3928 is running
10760 is running
10564 is running
0
1
4
9
16
25
36
49
64
81

如果把p.shutdown(wait=True)去掉,则会出现结果穿插在进程中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2908 is running
8092 is running
10376 is running
13136 is running
8092 is running
2908 is running
0
1
8092 is running
10376 is running
4
2908 is running
10376 is running
9
16
25
36
49
64
81

同步调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def task(x):
    print("%s is running" % os.getpid())
    time.sleep(random.randint(1,3))
    return x**2

if __name__=="__main__":
    p = ProcessPoolExecutor()
    for i in range(10):
        res = p.submit(task,i).result()#返回计算结果
        print(res)
    print("主")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
结果为:

8360 is running
0
472 is running
1
4888 is running
4
12980 is running
9
8360 is running
16
472 is running
25
4888 is running
36
12980 is running
49
8360 is running
64
472 is running
81

串行执行,效率低下。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157315.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
concurrent.futures模块(进程池/线程池)
本节主题是实现单线程下的并发,即只在一个主线程,并且很明显的是,可利用的cpu只有一个情况下实现并发,
全栈程序员站长
2022/07/21
1.5K0
concurrent.futures模块(进程池/线程池)
Python Django 协程报错,进程池、线程池与异步调用、回调机制
concurrent.futures模块提供了高度封装的异步调用接口  ThreadPoolExecutor:线程池,提供异步调用  ProcessPoolExecutor: 进程池,提供异步调用
py3study
2020/02/27
2K0
使用concurrent.futures模块并发,实现进程池、线程池
一、关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的异步多线程/多进程代码。从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类ThreadPoolExecutor和ProcessPoolExecutor继承了Executor,分别被用来创建线程池和进程池的代码。实现了对threading和mu
用户1214487
2018/01/24
8870
python:ThreadPoolExecutor线程池和ProcessPoolExecutor进程池
使用:移动端多用例并行执行的时候,需要设备空闲才执行,我们可以用线程来管理一个设备,设备执行完毕 就下发一个任务。这个最好的方式 可以和队列放在一起去执行。
雷子
2023/12/04
5630
python:ThreadPoolExecutor线程池和ProcessPoolExecutor进程池
Python基础22-并发编程
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1K0
Python基础22-并发编程
6.并发编程,总结
编程思想,模型,设计模式,理论等等,都是交给你一种编程的方法,以后你遇到类似的情况,套用即可.
changxin7
2019/09/10
8730
一篇文章梳理清楚 Python 多线程与多进程
在学习Python的过程中,有接触到多线程编程相关的知识点,先前一直都没有彻底的搞明白。今天准备花一些时间,把里面的细节尽可能的梳理清楚。
吾非同
2021/12/13
9760
一篇文章梳理清楚 Python 多线程与多进程
Python Day10
所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象 如下就是死锁:
py3study
2020/01/10
6140
第37天并发编程之线程篇
问题:为什么多个线程不能同时使用一个python解释器呢? 这是因为在Python中有一种垃圾回收机制,当一个value的引用计数为0之后,就会被python的垃圾回收机制所清空掉。但是python的垃圾回收机制其实也是通过一个线程来执行的,如果可以同时调用解释器,这就会出现这样一个问题:如果我赋值了一个操作a = [1, 2, 3]的时候,当我这个线程还没有执行这个操作,只是创建了一个值[1, 2, 3]的时候,突然python解释器把垃圾回收机制的线程给执行了,这是垃圾回收机制就会发现这个值[1, 2, 3]当前引用计数还是0呢,就直接清掉了,但是此时我还没有来得及给a赋值呢,这就出现了数据错乱的问题。 # This lock is necessary mainly because CPython’s memory management is not thread-safe. # 意思是CPython的内存管理机制(垃圾回收机制)不是线程安全的,因此我们不能让python线程同时去调用python解释器。
py3study
2020/01/21
3940
python并发编程-进程池线程池-协程-I/O模型-04
而物理设备的性能是有限的,虽然可以加设备来提升上限,但如果像淘宝双十一那样,只有很少的时刻需要大量的资源,为了满足这个去买一大堆服务器显然是不划算的
suwanbin
2019/09/26
8780
python并发编程-进程池线程池-协程-I/O模型-04
python concurrent.futures(并行编程 24)
nlist=[1,2,3,4,5,6,7,8,9,10] def evaitem(x): rs=count(x) print("item "+str(x)+" reuslt"+str(rs)) def count(x): for i in range(0,10000000): i=i+1 return i*x if name=="main": stime=time.clock() for item in nlist: evaitem(item) print("sequential execution in "+str(time.clock()-stime),"seconds") stime1=time.clock() with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: for item in nlist: executor.submit(evaitem,item) print("thread execution in "+str(time.clock()-stime1),"seconds") stime2 = time.clock() with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor: for item in nlist: executor.submit(evaitem, item) print("process execution in " + str(time.clock() - stime2), "seconds")
用户5760343
2019/07/30
6390
Python3快速入门(九)——Pyth
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程本身不拥有系统资源,与进程内的其它线程共享进程的所有资源。一个进程中至少有一个线程,并作为程序的入口,即主线程,其它线程称为工作线程。      多线程,是指从软件或者硬件上实现多个线程并发执行的技术。支持多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,进而提升整体处理性能。
py3study
2020/01/03
7640
4.并发编程多线程
multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍
changxin7
2019/09/10
7370
并发编程(四)
Cpython解释器自带的GIL解释器锁,线程要想执行代码去抢锁,抢python解释器,之后才回收,那么这样就能保证了阻止同一个进程下的多个线程同时被运行,不容易造成数据错乱;比如,抢票,如果你提交了订单,那么别人还能操作到你这张票的订单吗?不会了吧;这样就进而使数据不容易错乱;
HammerZe
2022/03/24
4650
并发编程(四)
python之多进程
python中的多线程无法利用多核优势,如果想要充分地使用多核cpu的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。python提供了multiprocessing
py3study
2020/01/19
9670
Python与进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基 本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体; 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进 程是程序的实体。
星陨1357
2023/03/14
1.6K0
Python与进程
motan之异步调用
一、什么是异步调用?  1.同步调用 方法间的调用,假设A方法调用B方法,A方法等待B方法执行完毕后才执行本身,这个同步调用,是具有阻塞式的调用,如果B方法非常耗时,那么整个方法的执行效率将会非常低; 2.异步调用 同样是方法间的调用,假设A方法调用B方法,不同的是A方法调用B方法后,B方法很快的返回给A方法个答复(这个答复不是执行完整个B方法的答复),A方法收到答复后就执行本身,这个是异步调用,不管B方法是否耗时,整体的效率都提升。 二、motan的异步调用入门 1.首先,以入门案例为基础案例
似水的流年
2018/07/04
8340
并发编程
    c)      当一个任务遇到输入输出工作的时候能够让另一个任务使用CPU去计算
GhostCN_Z
2020/04/03
6200
并发编程
Python之线程
操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。在多道编程中,我们允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行。正是这样的设计,大大提高了CPU的利用率。进程的出现让每个用户感觉到自己独享CPU,因此,进程就是为了在CPU上实现多道编程而提出
新人小试
2018/04/12
1.4K0
Python之线程
进程池、线程池、回调函数、协程
  也就是说,硬件的承载能力是有限度的,在保证高效率工作的同时应该还需要保证硬件的资源占用情况,所以需要给硬件设置一个上限来减轻硬件的压力,所以就有了池的概念。
py3study
2020/01/15
5800
相关推荐
concurrent.futures模块(进程池/线程池)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验