首页
学习
活动
专区
工具
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()来暂停协程的执行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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()获取,然后可以在此基础上进行操作。

39031
  • Python asyncio之协程学习总结

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

    854100

    再议Python协程——从yield到asyncio

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

    1.7K71

    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,事件循环不存在,将会导致错误。

    71810

    以定时器为例研究一手 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 队列,在下一轮循环时取出并从挂起位置恢复执行。 由于协程代码在执行时会切换控制权导致代码逻辑跳来跳去,有时会被绕晕,借助定时器调度可以让整个事件循环逻辑更加清晰。

    13310

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

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

    98620

    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.

    62920

    【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操作。

    35710

    【说站】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操作时,自动化切换执行其他任务。

    37920

    python中重要模块--asyncio

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

    2K70

    如何解决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.4K40

    爬虫之异步协程学习总结

    协程对象:执行协程函数得到协程对象。执行协程函数创建协程对象,函数内部代码不会执行。 协程意义 为什么要用协程?...,交出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

    81410

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

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

    48950

    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

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

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

    42530
    领券