Python asyncio事件循环在Go语言中的等效项

voj3qocg  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(129)

我使用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

如有任何帮助,我们将不胜感激。

h5qlskok

h5qlskok1#

用Python的术语来说,事件循环是内置在Go语言中的,你可以用go async_say(...)来启动两个goroutine,然后等待它们完成,比如用channel或者wait group
将代码直接翻译成Go语言,如下所示:

package main

import "fmt"
import "time"

func async_say(delay time.Duration, msg string, done chan bool) {
    time.Sleep(delay)
    fmt.Println(msg)
    done <- true
}

func main() {
    done1 := make(chan bool, 1)
    go async_say(4 * time.Second, "hello", done1)
    done2 := make(chan bool, 1)
    go async_say(6 * time.Second, "world", done2)
    <-done1
    <-done2
}

请注意,与Python(和JavaScript等)不同,Go语言的函数并不依赖于它们是否异步而有不同的colors,它们 * 都 * 可以异步运行,而asyncio的等价物已经内置在标准库中。

js4nwp54

js4nwp542#

在围棋中不需要这样,因为这是一个反模式.
相反,在Go语言中,"pollable" descriptors的管理--比如socket--与运行时和goroutine调度器紧密集成在一起。(例如Linux上的epoll,FreeBSD上的kqueue和Windows上的IOCP).一旦goroutine试图在一个套接字上执行I/O,而套接字还没有准备好,goroutine会被挂起直到数据准备好,然后它会在挂起的地方重新开始。
因此,在Go语言中,你只需要创建一个单独的goroutine来服务于每个请求,这些请求应该与其他请求同时执行或服务,然后编写简单的顺序代码来处理它们。
对于背景,启动herehere
解释Go语言调度器工作原理的教程有thisthis

相关问题