asyncio 协程 异步执行

Python学习:异步IO:协程和asyncio 所谓协程就是在一个线程中切换子进程,相比多线程有如下好处:最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。python的协程通过gene 阅读详情

背景

在抓取Compare, Download & Develop Open Source & Business Software - SourceForge网站内的linux开源软件时,同一款软件有多个版本和对应的多个不同格式的包,按照以往的线性模式,爬取一页29款软件需花费33分钟。共计999页,预计花费22天。

分析得出,大部分时间都在遍历软件的不同文件夹,

我是否可以优化为,同时发送多个请求进行文件夹的遍历,从而解决占用时间过多的问题。

如使用协程进行异步执行。将代码进行异步后发现,爬取信息的速度加快,但网站拥有反扒等措施,同时大量多次访问会显示‘‘访问速度限制’’,无法正常访问,虽然异步后因为网站反扒限制没能解决爬取时间过长的问题,但是异步的方法还是很值得记录一下

接下来仅介绍协程如何使用

事件循环+同步调用API

import asyncio

import time

async def download(url):

    print("start download url")

    time.sleep(2)

    print("end download url")

if __name__ == "__main__":

    start = time.time()

    loop = asyncio.get_event_loop()

    loop.run_until_complete(download("www.baidu.com"))

    print(time.time()-start)

结果:

start download url
end download url
2.0046780109405518

注意:首先asyncio已经帮我们实现了基于各个系统(linux/windows/mac)事件循环模块,比如我们这里通过asyncio.get_event_loop() 获取事件循环对象,有了循环对象我们才能调度协称,获取协称的结果。

我们看到download
下载函数先执行第一个print,再sleep 2s,然后再print,从结果来看就是这样的,没有问题。

但是当我们在并发的情况下,在看看会有什么问题:

#只需要修改loop.run_until_complete这个入参就行

#其他都没变化

loop.run_until_complete(asyncio.wait([download("www.baidu.com") for i in range(2)]))

start download url
end download url
start download url
end download url
4.008697748184204

看到了吧,结果令人非常不适,你期望的结果是2s左右返回,但是为啥4s左右才返回呢?结局真的让人很头大。

罪魁祸首是谁呢?就是因为异步代码中有同步调用,即download协称中有time.sleep同步调用。

事件循环是单线程运行的,所以当sleep之后阻塞单线程,没办法继续运行,所以只能变成同步调用,所以你会看到2个download任务同步返回,耗时4s。

那么如何解决这个问题呢?

事件循环+异步调用API

用asyncio.sleep代替time.sleep

# 把download中time.sleep替换成await asyncio.sleep

await asyncio.sleep(2)

还是上面例子运行如下:

start download url
start download url
end download url
end download url
2.0069119930267334

我们可以看到两个任务并发运行,结果也是我们想要的2s,几乎可以认为两个任务是同时开始同时结束的,这就达到了异步编程的要求:要异步,所有的都要异步。

创建任务(Task)或者未来对象(Future)

上面我们讲解了事件循环如何调用协称来实现异步编程,其实事件循环不但可以调用协称,而且还可以调度Task或者Future对象,比如:

1

2

只需要修改loop.run_until_complete的入参即可 其他不用修改

loop.run_until_complete(asyncio.ensure_future(download("www.baidu.com")))

这里是通过asyncio.ensure_future创建Future对象,

而run_until_complete的入参是多选的,

协称/Future/Task都可以当作参数传递进去,比如创建Task对象:

# 解释同上

loop.run_until_complete(loop.create_task(download("www.baidu.com")))

通过loop.create_task创建Task对象,run_until_complete照样可以接受,为什么呢?

因为Task是Future的派生类,所以二者都可以当作入参传递。

还有asyncio.ensure_future的底层就是调用loop.create_task,所以看似ensure_future是和事件循环无关,

但其实内部是有获取事件循环并且调用create_task的。

部分源码:

def ensure_future(coro_or_future, *, loop=None):

    if coroutines.iscoroutine(coro_or_future):

        if loop is None: //没有事件循环

            loop = events.get_event_loop() //获取loop, 这个和main中外面获取的loop是同一个,因为在单线程中并且是线程安全的。

        task = loop.create_task(coro_or_future)

以上两者运行结果都是一样的,如下:

start download url
end download url
2.0043089389801025

asyncio.wait和asyncio.gather的高阶API用法

asyncio.wait我们上面示例都在用,大致意思就是运行所有协称/Task/Future,直到他们完成,而它本身就是一个协称,所以可以被事件循环run_until_complete调度。

我们重点说下asyncio.gather的用法,这个函数是high-level的,就是高度抽象的,它比wait更加灵活和方便。比如:

# 和wait用法一样

loop.run_until_complete(asyncio.gather(download("www.baidu.com")))

如果更加灵活呢?

# 示例1 和wait差不多,就是前面得加*

    tasks = [download("www.baidu.com") for i in range(2)]

    loop.run_until_complete(asyncio.gather(*tasks))

# 示例2:分组运行

    tasks1 = [download("www.baidu.com") for i in range(2)]

    tasks2 = [download("www.baidu.com") for i in range(2)]

    loop.run_until_complete(asyncio.gather(*tasks1, *tasks2))

如果想要接受返回值呢?

import asyncio

import time

# download上面定义过了

async def run():

    tasks1 = [download("www.baidu.com") for i in range(2)]

    tasks2 = [download("www.baidu.com") for i in range(2)]

    ret = await asyncio.gather(*tasks1, *tasks2)

    print(ret)

if __name__ == "__main__":

    start = time.time()

    asyncio.run(run())

    print(time.time()-start)

start download url

start download url

start download url

start download url

end download url

end download url

end download url

end download url

['hello world', 'hello world', 'hello world', 'hello world']

2.005855083465576

我们看到各个协称执行的结果也都获取到了,日常开发中建议多用gather

协称/Task/Future执行完之后想要回调怎么办?

很简单,虽然这种情况我们不多见,但是万一在项目中需要回调,那么只需要几行代码就可以搞定回调。

import asyncio

import time

from functools import partial

async def download(url):

    print("start download url")

    await asyncio.sleep(2)

    print("end download url")

    return "hello world" //协称返回的结果

def callback(url, future): //协称在return之前的回调

    print("回调了:", url)

if __name__ == "__main__":

    start = time.time()

    loop = asyncio.get_event_loop()

    future = asyncio.gather(download("www.baidu.com"))

    future.add_done_callback(partial(callback, "www.baidu.com")) //利用partial函数包装callback,因为add_done_callback添加回调只接受一个参数,所以这里必须得用partial包装成一个函数,那相应的callback需要在增加一个参数url,而且这个url必须放在参数前面,这样的话我们就可以在回调的时候传递多个参数了。

    loop.run_until_complete(future)

    print("协称运行的结果:", future.result())

    print(time.time()-start)

运行结果:

start download url
end download url
回调了: www.baidu.com
协称运行的结果: ['hello world']
2.0060088634490967

syncio的高阶API和事件循环相结合起来,可以在python的异步编程中发挥巨大作用,你只需要像编写同步代码那样编写异步代码,只是异步多了几个语法规则而已,只有多做才能熟练。

python中的asyncio使用详解与异步协程的处理流程分析 阅读详情

相关推荐

【问题解决】Python 异步 asyncio 卡死、协程不执行、任务泄漏,保姆级排错

本文详细分析了Python异步编程中常见的卡死、协程不执行和任务泄漏问题。文章首先列举了这些问题的典型表现,如程序卡住、死锁、任务未启动等。然后深入剖析了各类问题的根源,包括同步阻塞操作、未正确await、资源未清理等。针对这些问题,文章提供了两套解决方案:一是异步编程最佳实践,包括安全协程执行、带超时的执行、任务清理等实用方法;二是死锁检测和预防机制,通过锁管理和等待图分析来避免死锁。文章还包含可直接使用的代码示例,帮助开发者快速定位和解决异步编程中的常见问题。

博客 451

Python 异步: 创建和运行异步任务(7)

您可以从 asyncio 程序中的协程创建任务对象。任务提供独立调度和运行的协程的句柄,并允许查询、取消任务,以及稍后检索结果和异常。异步事件循环管理任务。因此,所有协程都成为事件循环中的任务并作为任务进行管理。 让我们仔细看看 asyncio 任务。 1. 什么是异步任务 异步任务是一个调度并独立运行 asyncio 协程的对象。它提供了一个调度协程的句柄,asyncio 程序可以查询并使用它来与协程交互。 任务是从协程创建的。它需要一个协程对象,包装协程,安排它执行,并提供与之交互的方法。任务独立执行

冷冻工厂 772

超牛逼的异步协程爬虫

文章目录一、引入二、异步协程1. event_loop2. coroutine3. task4. future5. 绑定回调三、多任务协程 一、引入 无论是多进程还是多线程,在遇到 IO 阻塞时都会被操作系统强行剥夺走 CPU 的执行权限,程序的执行效率因此就降低了下来。 想要解决这个问题,我们可以自己从应用程序级别检测 IO 阻塞,如果阻塞就切换到程序的其它任务,这样就可以将程序的 IO 降到最...

Alex 2万+

简单粗暴有效上手Python3异步asyncio

最基本的定义和应用 import asyncio # 定义一个可以异步调用的函数,其类型为coroutine async def func1(): pass if __name__ == '__main__': loop = asyncio.get_event_loop() # 定义一个用来循环异步函数的loop对象 task = asyncio.ensure_futu...

Dexter's Laboratory 4340

TS808效果器制作教程

TS808效果器制作教程 可以在立创商城购买到大部分的电阻电容和IC,音频接口,踩钉,电位器和电源接口可以去某宝看看都买得到的。链接https//pan.baidu.com/s/1QId1eIE3fJ2u5NLBSISvGA。安装过程过于繁琐,把所有元器件按照图纸焊接完成就可以调试了,祝你们成功!这是TS808经典效果器制作过程的记录。IC是JRC4558。...

qq_18948149的博客 3429

新手3dslicer手动肝脏切割及体积测量(详细图文)

刚接手软件的时候,我一直想用自动分割工具,试验了Med sam,依赖安装不了;试验了英伟达的AI,NvidiaAIAssis,传服务器根本没反应,所有只有用了手动切割。不要求所有层面勾画,但是最好是典型层面都勾画一下,特别是有毗邻脏器密度相近的层面。点击3D后可能三维窗口未显示,可以调整一下窗口大小,有可能显示在我们看见的范围之外。早就准备更新这篇了,由于懒癌发作,一直早葛优躺,今天刚好有点时间,就简单写下来。

linjianping513的博客 5932

python-asyncio异步基础

python-asyncio异步基础学习

刚入职的Android系统工程师小白 4376

嵌入式软件面试常见问题及答案

干了多年的嵌入式,被面试过,也面过不少新人,下面这些是面试中很常见的一些问题及答案,答案可以根据自己的经验自己思考下。--持续补充并更新

weixin_37553721的博客 6026

使用asyncio进行异步编程

异步编程是一种编程范式,允许程序在等待I/O操作完成时执行其他任务。在异步编程中,程序不会阻塞在某个任务上,而是在等待某个任务完成时切换到其他任务。这有助于提高程序的执行效率,特别是在I/O密集型任务中。asyncio是Python的一个标准库,用于编写异步代码。它提供了协程、事件循环、异步I/O操作等功能,帮助开发者更容易地实现异步编程。本文介绍了Python的asyncio库以及异步编程的基本概念,如协程、事件循环和异步I/O操作。我们还通过实际示例展示了如何使用asyncio编写高效的异步代码。

qq_33578950的博客 454

华为od面试手撕真题【分解质因数】

华为od面试手撕真题【分解质因数】

MISAYAONE的博客 1136

【OpenClaw企业级智能体实战】第13篇:1+N架构实战!OpenClaw多Agent数字员工军团搭建指南(含完整配置+路由策略+代码落地)

单Agent因“记忆负担重、Token消耗高、响应不精准”已难以满足复杂场景需求,而多Agent团队通过“1个编排者+N个执行者”的分工协作模式,能让效率提升300%以上。本文基于OpenClaw 2026稳定版,结合阿里云开发者社区实战案例,从核心认知、准备工作、实操流程、协作机制、安全配置五大维度,完整拆解多Agent团队搭建全流程。文中包含可直接复制执行的代码、详细配置模板、路由策略设置及常见问题排查,新手可在1-2小时内落地属于自己的“数字员工”军团,覆盖内容创作、技术支持、多平台运营等多场景。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 749

Python Asyncio异步操作

Asyncio

m0_53244394的博客 1779

深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天

文章目录前期工作设置GPU导入数据标准化可视化构建CNN网络编译训练模型预测模型评估 前期工作 设置GPU 如果使用的是CPU可以忽略这步 import tensorflow as tf gpus = tf.config.list_physical_devices("GPU") if gpus: gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPU tf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量

“365天深度学习训练营”报名进行中~ 7856

软件测试 | 测试开发 | python中的asyncio使用详解与异步协程的处理流程分析

这段代码定义了两个协程,并将它们放到另外一个协程main函数中,想要获得它们运行的结果,事件循环的特点是当它遇到某个I/O需要等待(如这里的asyncio.sleep()函数)的时候,可以去执行其它的函数,这样,整个函数执行所需要的时间,应该是所有协程中执行时间最长的那个,对于上面这个代码来说,一个sleep了3秒,一个sleep了1秒,总的用时应该是3秒多一点,但结果是这样吗?因此,这些异步函数可以协同(Cooperative)运行:这就是事件循环的目标。那应该怎样才能并发执行呢?

慕漓的博客 471

Dify框架面试内容整理-如何进行Dify的二次开发?

无论是轻量修改界面,还是深度集成自定义模型、Agent、知识库,你都可以很方便地进行二次开发。,你可以基于它的开源架构对功能进行扩展、集成第三方服务、修改界面风格,甚至定制新的AI工作流程。前端:Node.js >= 16,React + TypeScript + Tailwind。接入自己的模型API(如:调用LLaMA、Baichuan、ChatGLM)。修改路径:/api/app/services/providers/可接入你自己的向量数据库(Qdrant、Milvus、FAISS)

不务正业的猿 2009

[24] cuda 应用之 nppi 实现图像颜色通道变换

[24] cuda 应用之 nppi 实现图像颜色通道变换

yohnyang的博客 343

python 协程asyncio使用

python 协程asyncio使用

yuhengshi的博客 797

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

协程asyncio_python异步编程模块asyncio学习(一)

点击上方蓝字关注asyncio模块提供了使用协程构建并发应用的工具。它使用一种单线程单进程的的方式实现并发,应用的各个部分彼此合作, 可以显示的切换任务,一般会在程序阻塞I/O操作的时候发生上下文切换如等待读写文件,或者请求网络。同时asyncio也支持调度代码在将来的某个特定事件运行,从而支持一个协程等待另一个协程完成,以处理系统信号和识别其他一些事件。异步并发的概念 对于其他的并发模...

weixin_39700215的博客 144

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

浅谈Python库之asyncio

asyncio是 Python 中用于编写异步 I/O(输入 / 输出)代码的库。它是在 Python 3.4 版本中引入的,主要基于协程(coroutine)的概念构建。在传统的同步编程中,程序在执行 I/O 操作(如读取文件、网络请求)时会被阻塞,等待操作完成后才能继续执行下一行代码。而asyncio允许程序在等待 I/O 操作时,将执行权交给其他任务,从而实现高效的并发执行。例如,在一个网络爬虫程序中,需要同时向多个网站发送请求获取数据。

a876106354的博客 1428

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

协程asyncio_Python异步编程模块asyncio学习

asyncio是Python3.4引入的一个标准库,直接内置了对异步IO的支持。asyncio模块提供了使用协程构建并发应用的工具。它使用一种单线程单进程的的方式实现并发,应用的各个部分彼此合作, 可以显示的切换任务,一般会在程序阻塞I/O操作的时候发生上下文切换如等待读写文件,或者请求网络。同时asyncio也支持调度代码在将来的某个特定事件运行,从而支持一个协程等待另一个协程完成,以...

weixin_39779032的博客 115

Python异步编程模块asyncio学习

asyncio是Python3.4引入的一个标准库,直接内置了对异步IO的支持。asyncio模块提供了使用协程构建并发应用的工具。它使用一种单线程单进程的的方式实现并发,应用的各个部分彼此合作, 可以显示的切换任务,一般会在程序阻塞I/O操作的时候发生上下文切换如等待读写文件,或者请求网络。同时asyncio也支持调度代码在将来的某个特定事件运行,从而支持一个协程等待另一个协程完成,以处理系统信...

python学习者的博客 695

使用Asyncio构建高并发Python应用程序

不同于多线程,Asyncio 是单线程的,但其内部 event loop 的机制,可以让它并发地运行多个不同的任务,并且比多线程享有更大的自主控制权。Asyncio 中的任务,在运行过程中不会被打断,因此不会出现 race condition 的情况。尤其是在 I/O 操作 heavy 的场景下,Asyncio 比多线程的运行效率更高。因为 Asyncio 内部任务切换的损耗,远比线程切换的损耗要小;并且 Asyncio 可以开启的任务数量,也比多线程中的线程数量多得多。

nhb687096的博客 965

python-15-异步IO

异步IO 1、协程 在执行过程中,子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。一个线程执行的过程中。 优势在于极高的执行效率,不需要线程切换;不需要多线程的锁机制。 通过generator实现。 子程序就是协程的一种特例 def consumer(): r = '' while True: n = yield r if...

daiyuxiong的博客 136

协程asyncio_Python 异步模块 asyncio 中的协程与任务

协程(Coroutine)是允许执行被挂起、恢复、以及取消的程序。Python 3 中最初是使用 @asyncio.coroutine 装饰器和 yield from 关键字组合来实现协程。单词 yield 在这里并非在生成器(Generator)中所表示的“产出”,而是交通标志中所表达的“让步”之意。其实在生成器中也包含“让步”的意思,即把执行权交给调用者,生成器暂缓执行,等待调用者对生成的结果...

weixin_39614637的博客 286

突破性能瓶颈:使用Asyncio构建高并发Python应用程序

不同于多线程,Asyncio 是单线程的,但其内部 event loop 的机制,可以让它并发地运行多个不同的任务,并且比多线程享有更大的自主控制权。Asyncio 中的任务,在运行过程中不会被打断,因此不会出现 race condition 的情况。尤其是在 I/O 操作 heavy 的场景下,Asyncio 比多线程的运行效率更高。因为 Asyncio 内部任务切换的损耗,远比线程切换的损耗要小;并且 Asyncio 可以开启的任务数量,也比多线程中的线程数量多得多。

2301_78276982的博客 1175

Python | 小白的 Asyncio 教程

所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知。Asyncio 是并发(concurrency)的一种方式。对 Python 来说,并发还可以通过线程(threading)和多进程(multiprocessing)来实现。 Asyncio 并不能带来真正的并行(parallelism)。当然,因为 GIL(全局解释器锁)的存在,Python 的多线程也不能带来真正的并行。可交给 asyncio 执行的任务,称为协程(coroutine)。一个协

wsq的博客 601
上一篇: 通过python进行PNG转SVG
下一篇: php中如何获取请求头header
五个饺子馆
博客等级 码龄10年 4粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值