我使用asyncio
事件循环,这是一种在 Python3.x 中执行异步/并发任务的循环。
在Go语言中,是否有asyncio
(async/await)或协程的等价物只在a thread上使用?
[注]:
不是parallelism + concurrency
(多处理)模式。
【更新】:
下面是一个使用Python中的asyncio
的异步事件循环:
import asyncio
import time
async def async_say(delay, msg):
await asyncio.sleep(delay)
print(msg)
async def main():
task1 = asyncio.ensure_future(async_say(4, 'hello'))
task2 = asyncio.ensure_future(async_say(6, 'world'))
print(f"started at {time.strftime('%X')}")
await task1
await task2
print(f"finished at {time.strftime('%X')}")
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
输出:
started at 13:19:44
hello
world
finished at 13:19:50
如有任何帮助,我们将不胜感激。
2条答案
按热度按时间h5qlskok1#
用Python的术语来说,事件循环是内置在Go语言中的,你可以用
go async_say(...)
来启动两个goroutine,然后等待它们完成,比如用channel或者wait group。将代码直接翻译成Go语言,如下所示:
请注意,与Python(和JavaScript等)不同,Go语言的函数并不依赖于它们是否异步而有不同的colors,它们 * 都 * 可以异步运行,而asyncio的等价物已经内置在标准库中。
js4nwp542#
在围棋中不需要这样,因为这是一个反模式.
相反,在Go语言中,"pollable" descriptors的管理--比如socket--与运行时和goroutine调度器紧密集成在一起。(例如Linux上的
epoll
,FreeBSD上的kqueue
和Windows上的IOCP).一旦goroutine试图在一个套接字上执行I/O,而套接字还没有准备好,goroutine会被挂起直到数据准备好,然后它会在挂起的地方重新开始。因此,在Go语言中,你只需要创建一个单独的goroutine来服务于每个请求,这些请求应该与其他请求同时执行或服务,然后编写简单的顺序代码来处理它们。
对于背景,启动here和here。
解释Go语言调度器工作原理的教程有this和this。