我正在使用 uvloop
与 websockets
作为
import uvloop
coro = websockets.serve(handler, host, port) # creates new server
loop = uvloop.new_event_loop()
loop.create_task(coro)
loop.run_forever()
它工作正常,我只是想知道我是否可以在不设置全局
asyncio
的情况下遇到一些意想不到的问题。政策到 uvloop
.据我了解,只要没有任何内容不使用全局 asyncio
,就应该不设置全局策略。方法,但直接与传递的事件循环一起使用。那是对的吗?
最佳答案
asyncio 中有三个主要的全局对象:
所有在 asyncio 中获取当前上下文的尝试都通过一个函数,asyncio.get_event_loop .
要记住的一件事是 since Python 3.6 (和 Python 3.5.3+),
get_event_loop
有一个特定的行为:示例 1:
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
loop = asyncio.get_event_loop()
loop.run_forever()
这里的策略是 uvloop 策略。
get_event_loop
返回的循环是一个 uvloop,它被设置为这个线程的默认循环。当这个循环运行时,它被注册为运行循环。在本例中,调用
get_event_loop()
该线程中的任何地方都返回正确的循环。示例 2:
import uvloop
loop = uvloop.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_forever()
这里的策略仍然是默认策略。
new_event_loop
返回的循环是一个 uvloop,并使用 asyncio.set_event_loop
显式设置为该线程的默认循环.当这个循环运行时,它被注册为运行循环。在本例中,调用
get_event_loop()
该线程中的任何地方都返回正确的循环。示例 3:
import uvloop
loop = uvloop.new_event_loop()
loop.run_forever()
这里的策略仍然是默认策略。
new_event_loop
返回的循环是一个 uvloop,但它没有被设置为这个线程的默认循环。当这个循环运行时,它被注册为运行循环。在本例中,调用
get_event_loop()
在协程中返回正确的循环(正在运行的 uvloop)。但是打电话get_event_loop()
在协程之外将导致一个新的标准 asyncio 循环,设置为该线程的默认循环。所以前两种方法很好,但不鼓励第三种方法。
关于python-asyncio - 使用替代事件循环而不设置全局策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44000136/