首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么asyncio.sleep()会导致"got附加到不同的循环“?

asyncio.sleep()会导致"got附加到不同的循环"的原因是因为asyncio.sleep()是一个异步函数,它用于在协程中暂停一段时间。在使用asyncio.sleep()时,需要注意它是基于事件循环的,而事件循环是异步编程的核心机制。

当调用asyncio.sleep()时,它会在当前的事件循环中创建一个延迟对象,并将当前协程挂起,让其他协程有机会执行。延迟对象会在指定的时间后触发,然后再次将协程放回事件循环中继续执行。

然而,如果在一个协程中使用了多个事件循环,或者在不同的协程中使用了不同的事件循环,就会导致"got附加到不同的循环"的错误。这是因为每个事件循环都有自己的任务队列和调度器,协程只能在所属的事件循环中执行。

要解决这个问题,可以通过以下几种方式:

  1. 在协程中使用正确的事件循环:确保在协程中使用的事件循环是一致的,可以通过asyncio.get_event_loop()获取当前的事件循环,并在协程中使用它。
  2. 在协程中使用asyncio.ensure_future():使用asyncio.ensure_future()将协程包装成一个Future对象,并将其添加到事件循环中执行。这样可以确保协程始终在同一个事件循环中执行。
  3. 在协程中使用await asyncio.sleep():如果在协程中需要暂停一段时间,可以使用await asyncio.sleep()而不是直接调用asyncio.sleep()。这样可以确保协程在同一个事件循环中执行,并避免"got附加到不同的循环"错误。

总结起来,asyncio.sleep()会导致"got附加到不同的循环"是因为协程可能在不同的事件循环中执行。为了避免这个问题,需要确保在协程中使用正确的事件循环,或者使用asyncio.ensure_future()包装协程,或者使用await asyncio.sleep()来暂停协程的执行。

相关搜索:为什么带有goroutines的for循环会导致数据丢失为什么这个基于ranged的循环会导致减法问题?为什么使用ivar会导致反应性可可的滞留循环?为什么我的ngrx操作会导致无休止的循环?在函数中选择列的不同方式会导致不同的结果,为什么?为什么Java中的这个循环会导致堆栈溢出错误?为什么这个简单的moment.js逻辑会导致无限循环?为什么不同的操作会导致相同的操作?PHP e C#为什么在不同部分定义的包含"typedef“的类会导致错误?为什么带有重定向的add_filter会导致无限重定向循环?为什么make_reverse_iterator(make_reverse_iterator(it))会导致不同的类型?为什么带有GCC的x86上的整数溢出会导致无限循环?为什么网络体系结构的不同会导致名称分类的巨大差异为什么用离散选项拟合具有随机效果的GAM会导致非常不同的输出?为什么在使用getchar()的while循环中移动printf()会产生不同的结果?Golang -为什么相似机器上的编译会导致显著不同的二进制文件大小?使用map、forEach和for循环将数组插入数据库时,数组的顺序为什么会不同为什么目标设备更换为不同的Android版本时,有一个自定义的apk名称会导致错误?为什么将模块加载到局部变量或全局变量会导致不同的结果,这取决于Lua中的模块?为什么这段代码会导致无限循环?另外,我如何完全重启我的数字棒球比赛?(我如何重新生成随机数?)
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python异步IO操作,看这个就够了

构建健壮多线程程序是困难且容易出错,异步 IO 避免了线程设计可能遇到某些潜在速度瓶颈。 这并不是说写异步 IO 代码是简单,请注意:当你进入底层时,异步编程也可能很困难!...很少情况下会在 async del 代码块中使用 yield ,如果用了,产生一个异步生成器。 任何 async def 内都不能使用 yield from,抛出语法错误。...还有一种可以与异步 IO 一起使用数据结构:许多彼此不相关生产者将项目添加到队列中。每个生产者可以在交错、随机、未通知时间将多个项目添加到队列中。...从理论上讲,你可以在不同系统上使用不同用户来控制生产者和消费者管理,而队列则作为中间桥梁。...你可能想知道为什么 Python requests 库与异步 IO 不兼容,原因是 requests 库建立在 urllib3 之上,而 urllib3 又使用 Python http 和套接字模块

2.7K31

Python-asyncio异步编程基础

(主要还是在用golang) 需要了解几个词 协程(coroutine):与线程很相似,不同之处在于多协程是同一个线程来执行,这样就省去了线程切换时间,而且不需要多线程锁机制了,执行效率高很多...实际处理这个调用部件在完成后,通过状态、通知和回调来通知调用者 事件循环:事件循环是一种处理多并发量有效方式,在维基百科中它被描述为「一种等待程序分配事件或消息编程架构」,我们可以定义事件循环来简化使用轮询方法来监控事件...asyncio核心编程模型就是一个消息循环,我们从asyncio模块中直接获取一个EventLoop引用,然后把需要执行协程扔到EventLoop中执行,就实现了异步IO import threading...如果把asyncio.sleep()换成真正IO操作,则多个coroutine就可以由一个线程并发执行 async / await Python 3.5开始引入了新语法async和await,可以让..., 这里时间指的是事件循环内部时间,可以通过loop.time()获取,然后可以在此基础上进行操作。

39931
  • Python asyncio之协程学习总结

    可以利用这个特性,将秒数设置为0,即asyncio.sleep(0),以便提供一个经优化路径以允许其他任务运行。 这可供长时间运行函数使用,避免调用该函数时阻塞事件循环。...此函数运行传入协程,负责管理 asyncio 事件循环,终结异步生成器,并关闭线程池。 当有其他 asyncio 事件循环在同一线程中运行时,此函数不能被调用。...如果debug 为 True,事件循环将以调试模式运行。 此函数总是创建一个新事件循环并在结束时关闭之。它应当被用作 asyncio 程序主入口点,理想情况下应当只被调用一次。...如果其他事件循环不同线程中运行,则其他task可以并行运行。当task等待future完成时,事件循环执行一个新task。 取消一项task和取消一个future是不同。...该函数被从不同于运行事件循环线程线程调用。

    904100

    再议Python协程——从yield到asyncio

    我们先回忆一下yield功能: (1) 在函数中,语句执行到yield,返回yield 后面的内容;当再回来执行时,从yield下一句开始执行; (2) 使用yield语法函数是一个生成器; (...事件循环需要实现两个功能,一是顺序执行协程代码;二是完成协程调度,即一个协程“暂停”时,决定接下来执行哪个协程。 (2)协程上下文切换。..., 添加到事件循环事件必须继承YieldEvent, 并重写它定义两个方法。...由于asyncio.sleep()也是一个coroutine,所以线程不会等待asyncio.sleep(),而是直接中断并执行下一个消息循环。...(2) 一旦使用协程,大部分ython库并不能很好兼容,这就会导致要改写大量标准库函数。 所以,最好别用协程,一旦用不好,协程给程序性能带来提升,远远弥补不了其带来灾难。

    1.8K71

    Python协程

    也就是说将多个协程放入同一个事件循环中,当一个协程执行到await时候,自动切到另一个协程执行。...mian()执行到await c1时候,等待func1执行; func1执行到await asyncio.sleep(3)时候,自动跳转到事件循环其它协程函数,这里就是func2; 然后func2...所以接着从2开始打印。直到func2执行结束。本次整个事件循环执行结束。 为什么要把asyncio.create_task封装在另一个协程函数内?...这是因为asyncio.create_task将协程封装到一个Task对象中并立即添加到事件循环任务列表中,如果不封装在另一个协程函数内,直接执行asyncio.create_task,由于此时还未执行...asyncio.run,事件循环不存在,将会导致错误。

    72610

    以定时器为例研究一手 Python asyncio 协程事件循环调度

    对象;另一个是 _ready 用来存放准备好执行协程,而 _scheduled 中有准备好协程取出来放入 _ready 中,loop 最终执行 Handle 都是从 _ready 中取出。...__step 是如何调度,其中调用 result = coro.send(None) 启动协程,首先输出 main start,然后调用 asyncio.sleep(3) 协程挂起 首先常见一个空...所以到此为止干的事儿就是遍历 future callbacks 逐一通过 loop.call_soon() 添加到 loop 中,等待下一轮事件循环执行,这里添加就是 main Task __...总结 asyncio 中定时通过 asyncio.sleep 实现,原理是在事件循环中维护一个最小堆实现优先队列 _scheduled,其中保存都是定时任务处理对象 Handle,越早到期 Handle..._ready 队列,在下一轮循环时取出并从挂起位置恢复执行。 由于协程代码在执行时会切换控制权导致代码逻辑跳来跳去,有时会被绕晕,借助定时器调度可以让整个事件循环逻辑更加清晰。

    14410

    python进阶(17)协程「建议收藏」

    "返回值" async def main(): print("main开始") # 创建协程,将协程封装到一个Task对象中并立即添加到事件循环任务列表中,等待事件循环去执行(默认是就绪状态...task1 = asyncio.create_task(func()) # 创建协程,将协程封装到一个Task对象中并立即添加到事件循环任务列表中,等待事件循环去执行(默认是就绪状态)。...Task对象中并添加到事件循环任务列表中,等待事件循环去执行(默认是就绪状态)。...接下里你肯定问:为什么python提供这种功能? 其实,一般在程序开发中我们要么统一使用 asycio 协程实现异步操作、要么都使用进程池和线程池实现异步操作。...# 内部事件循环自动化变为uvloop asyncio.run(...) 注意:知名asgi uvicorn内部就是使用uvloop事件循环

    1K20

    python多任务—协程(一)

    2、coroutine 协程:协程对象,只一个使用async关键字定义函数,他调用不会立即执行函数,而是返回一个协程对象。协程对象需要注册到事件循环中,由事件循环调用。...run_until_complete根据传递参数不同,返回结果也有所不同 1、run_until_complete()传递是一个协程对象或task对象,则返回他们finished返回结果(前提是他们得有...3.7 以前版本调用异步函数步骤: 1、调用asyncio.get_event_loop()函数获取事件循环loop对象 2、通过不同策略调用loop.run_forever()方法或者loop.run_until_complete...此函数总是创建一个新事件循环并在结束时关闭之。它应当被用作 asyncio 程序主入口点,理想情况下应当只被调用一次。...运行协程,asyncio提供了三种主要机制: 1、asyncio.run() 函数用来运行最高层级入口点,下例main()函数。此函数总是创建一个新事件循环并在结束时关闭之。

    1.5K20

    轻松理解 Python 中 async await 概念

    这就会导致, 现在情况是我们一边看着第一台洗衣机, 一边着急地想着 "是不是该去开第二台洗衣机了呢?" 但又不敢去 (只是打个比方), 最终还是花了10秒时间才 把衣服洗完....PS: 其实 demo2() 是无法运行, Python 直接警告你: RuntimeWarning: coroutine 'demo2....asyncio 库 sleep() 机制与 time.sleep() 不 # 同, 前者是 "假性睡眠", 后者是导致线程阻塞 "真性睡眠" await an_async_function() #...washing1(): await asyncio.sleep(3) # 使用 asyncio.sleep(), 它返回是一个可等待对象 print('washer1...创建一个事件循环 2. 将异步函数加入事件队列 3. 执行事件队列, 直到最晚一个事件被处理完毕后结束 4.

    66920

    【Python3爬虫】使用异步协程编写爬

    同步:不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致,称这些程序单元是同步执行。...异步:为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务方式,不相关程序单元之间可以是异步。 多进程:多进程就是利用 CPU 多核优势,在同一时间并行地执行多个任务。...二、异步协程 Python 中使用协程最常用库莫过于 asyncio,然后我们还需要了解一些概念: event_loop:事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足条件发生时候...(tasks)) 16 end = time.time() 17 print("Cost time: ", end - start) 这里我们有多个任务组成了一个列表tasks,然后我们将tasks添加到事件循环中...不停地下拉页面,会发现最后数字定格在35,也就是说总共有35页,每页链接都形如https://cuiqingcai.com/page/2,这样的话我们爬取的话就简单多了。

    1.1K20

    asyncio使用和原理

    任务 (Task): 任务是协程一种特殊形式,它包装了一个协程,并被添加到事件循环中执行。6. asyncio工作原理在asyncio中,事件循环是核心组件,它负责注册、调度和执行所有的协程任务。...当我们调用asyncio.run()函数时,创建一个事件循环并运行指定协程。事件循环不断地从任务队列中取出待执行任务,并将它们添加到事件循环中进行调度。...当一个协程中遇到await关键字时,事件循环挂起当前协程并将控制权交给其他可执行协程。被挂起协程暂时离开事件循环,并在异步操作完成后恢复执行。...在asyncio.run(main())中,我们运行了main()协程,它会创建一个事件循环并将fetch_data()协程添加到事件循环中进行调度。...避免阻塞操作: 在异步编程中,任何可能阻塞事件循环操作都应该尽量避免,包括CPU密集型操作和同步阻塞IO操作。

    39410

    python中重要模块--asyncio

    ,当满足事件发生时候,调用相应协程函数 coroutine 协程:协程对象,指一个使用async关键字定义函数,它调用不会立即执行函数,而是返回一个协程对象。...看了上面这些关键字,你可能扭头就走了,其实一开始了解和研究asyncio这个模块有种抵触,自己也不知道为啥,这也导致很长一段时间,这个模块自己也基本就没有关注和使用,但是随着工作上用python遇到各种性能问题时候...并行可以在操作系统多个抽象层次进行运用 所以并发通常是指有多个任务需要同时进行,并行则是同一个时刻有多个任务执行 下面这个例子非常形象: 并发情况下是一个老师在同一时间段辅助不同的人功课。...,马上ctrl+c,触发run_until_complete执行异常 KeyBorardInterrupt。...这个时候,main相当于最外出一个task,那么处理包装main函数即可。 不同线程事件循环 很多时候,我们事件循环用于注册协程,而有的协程需要动态加到事件循环中。

    2.1K70

    【说站】python Task如何在协程调用

    使用注意 Python3.7中添加到asyncio.create_task函数。在Python3.7之前,可以使用低级asyncio.ensure_future函数。...实例 import asyncio     async def func():     print(1)     await asyncio.sleep(2)     print(2)     return... "返回值"     async def main():     print("main开始")     # 创建协程,将协程封装到一个Task对象中并立即添加到事件循环任务列表中,等待事件循环去执行...task1 = asyncio.create_task(func())     # 创建协程,将协程封装到一个Task对象中并立即添加到事件循环任务列表中,等待事件循环去执行(默认是就绪状态)。     ...task2 = asyncio.create_task(func())     print("main结束")     # 当执行某协程遇到IO操作时,自动化切换执行其他任务。

    38620

    【Python爬虫实战】深入理解Python异步编程:从协程基础到高效爬虫实现

    这样可以提升程序效率和响应速度,特别适合处理I/O密集型任务(如网络请求、文件读写等)。 (一)核心概念 (1)事件循环: 异步编程核心是事件循环(Event Loop),它管理任务调度。...事件循环不断地检查是否有任务完成或需要开始新任务,从而实现任务非阻塞执行。 (2)协程(Coroutine): 协程是异步任务基本单元,是一个可以被挂起并在稍后继续执行函数。...队列使用可以很方便地控制协程之间数据传递和同步。 三、同步和异步对比 同步和异步是两种处理任务不同方式。它们在任务执行和等待机制上有显著区别,适合不同应用场景。...(二) 阻塞与非阻塞 同步:同步方式是阻塞,任务在执行期间阻塞代码后续执行,直到任务完成才会继续执行下一步。...(三)性能和效率 同步:在I/O操作频繁程序中,同步导致时间浪费,因为程序在等待I/O操作完成时处于空闲状态。适用于计算密集型或对顺序要求严格场景。

    6100

    如何解决selenium被检测,实现淘宝登陆

    ,因为有个输入速度检测机制 # 因为 pyppeteer 框架需要转换为js操作,而js和python类型定义不同,所以写法与参数要用字典,类型导入 await page.type(...(2) try : #鼠标移动到滑块,按下,滑动到头(然后延时处理),松开按键 await page.hover('#nc_1_n1z') # 不同场景验证码模块能名字不同...,把一些函数注册到事件循环上。...loop.run_until_complete(main(username, pwd, url)) #将协程注册到事件循环,并启动事件循环 运行结果: image.png image.png 原创文章...爬虫资源包汇总 python 高度鲁棒性爬虫超时控制问题 数据采集技术指南 第一篇 技术栈总览-总图和演讲ppt Python模拟登录几种方法(转) 解决爬虫模拟登录时验证码图片拉取提交问题两种方式

    4.6K40

    爬虫之异步协程学习总结

    协程对象:执行协程函数得到协程对象。执行协程函数创建协程对象,函数内部代码不会执行。 协程意义 为什么要用协程?...,交出cpu执行权给其他任务,执行挂起操作 print("2") async def func2(): print("a") await asyncio.sleep(2)...,必须等到内部多个异步任务都执行结束,这个新异步任务才会结束 # asyncio.run() 在事件循环上监听 async 函数main执行。...url) # 返回协程对象 task = asyncio.ensure_future(obj_func) # 创建任务对象 task_list.append(task) # 将创建好任务对象添加到任务列表中...# 创建事件循环对象 loop = asyncio.get_event_loop() # 将任务列表添加到事件循环中,任务列表使用asyncio.wait封装 loop.run_until_complete

    83710

    运筹帷幄决胜千里,Python3.10原生协程asyncio工业级真实协程异步消费任务调度实践 (转载非原创)

    Python3.10协程库async.io基本操作事件循环(Eventloop)是 原生协程库asyncio 核心,可以理解为总指挥。Eventloop实例提供了注册、取消和执行任务和回调方法。...Eventloop可以将一些异步方法绑定到事件循环上,事件循环循环执行这些方法,但是和多线程一样,同时只能执行一个方法,因为协程也是单线程执行。...当执行到某个方法时,如果它遇到了阻塞,事件循环暂停它执行去执行其他方法,与此同时为这个方法注册一个回调事件,当某个方法从阻塞中恢复,下次轮询到它时候将会继续执行,亦或者,当没有轮询到它,它提前从阻塞中恢复...,也可以通过回调事件进行切换,如此往复,这就是事件循环简单逻辑。...这也解释了为什么相似场景中多线程出场率要远远高于协程,就是因为多线程不需要考虑启动后“切换”问题,无为而为,简单粗暴。

    49950

    python 异步async库使用说明

    在学习asyncio之前,先理清楚同步/异步概念: 同步是指完成事务逻辑,先执行第一个事务,如果阻塞了,一直等待,直到这个事务完成,再执行第二个事务,顺序执行 异步是和同步相对,异步是指在处理调用这个事务之后...coroutine 协程:协程对象,指一个使用async关键字定义函数,它调用不会立即执行函数,而是返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。...每个线程有一个事件循环,主线程调用asyncio.get_event_loop()时会创建事件循环,把异步任务丢给这个循环run_until_complete()方法,事件循环安排协同程序执行。...由于await asyncio.sleep(1)也是一个coroutine,所以线程不会等待asyncio.sleep(1),而是直接中断并执行下一个消息循环。...1536843566.0769563 Hello World:1536843566.0779328 Hello World:1536843566.0799286 ·收集http响应 好了,上面介绍了访问不同链接异步实现方式

    2.5K10
    领券