【问题标题】:Python asyncio event loop equivalent in Go langGo 语言中的 Python 异步事件循环等价物
【发布时间】:2018-11-11 15:36:37
【问题描述】:

我使用asyncio事件循环,这是一种在Python3.x中执行异步/并发任务。

线程上是否有任何相当于asyncio (async/await) 或 Go 语言中的协程?


[注意]:

不是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

任何帮助将不胜感激。

【问题讨论】:

  • 寻求第三方资源(如图书馆)的问题是题外话。与其要求语言原语的等价物,更好的方法是询问您在 Go 中实际面临的特定问题以及如何解决该问题。
  • 只问你具体需要什么。你的问题不只是清楚。
  • @ShudiptaSharma 我更新了我的问题以获得更好的理解,我在 Go lang 中寻找等效的方法/模式

标签: python-3.x asynchronous go concurrency python-asyncio


【解决方案1】:

在 Python 术语中,事件循环内置于 Go。您可以使用 go async_say(...) 启动两个 goroutine 并等待它们完成,例如使用 channelwait 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。

【讨论】:

  • 再次感谢。你能在 Go 中写出与问题中的示例等效的内容吗? Go中的线程、进程和协程有什么区别以及如何访问它们?
  • @BenyaminJafari 我添加了一个大致相同的示例。 Go 中的线程、进程和协程之间有什么区别以及如何访问它们? 这些问题超出了 StackOverflow 答案的范围;您可能想查阅有关 Go 的书籍。
【解决方案2】:

在 Go 中你不需要这个,因为在 Go 中这将是一种反模式。

相反,在 Go 中,您可以管理 "pollable" descriptors(例如套接字)与运行时和 goroutine 调度程序紧密集成。 这允许您编写普通的 sequential 代码,这些代码将在内部通过特定于平台的“事件”接口(例如 Linux 上的 epoll、FreeBSD 上的 kqueue 和 Windows 上的 IOCP)进行处理。 一旦 goroutine 尝试在套接字上执行任何 I/O 并且套接字尚未准备好,goroutine 就会暂停,直到该数据准备好之后,它将在暂停的地方恢复。

因此,在 Go 中,您只需创建一个单独的 goroutine 来处理应该与其他请求同时执行或服务的每个请求,并编写简单的顺序代码来处理它。

对于背景,开始herehere

解释 Go 调度程序如何工作的教程是, 例如,thisthis

【讨论】:

  • 感谢有用的链接和 goroutines 关键字,例如 coroutines
  • 我未能解析那段关于 coouties 和 goroutines 的文章。从您的其他评论来看,您可能会混淆这两个术语,但 they are profoundly different。正如回答您问题的其他人所建议的那样,您似乎连最基本的围棋知识都缺乏。 Go 的“问题”在于它的并发方法与大多数其他主流语言(可能除了 Erlang)有很大不同,因此如果不熟悉该语言,您根本无法充分推理它。
  • the tour 开始,然后继续到books。如果你下定决心学习 Go,我建议直接跳到 GOPL,否则从免费的东西开始,比如 this one
  • 再次感谢。我以为coroutine和goroutine很相似,所以我一直错了。
猜你喜欢
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
相关资源
最近更新 更多