【问题标题】:Example of using hylang with python multiprocessing将 hylang 与 python 多处理一起使用的示例
【发布时间】:2019-06-05 17:11:10
【问题描述】:

我正在寻找一个将 python 多处理(即进程池/线程池、作业队列等)与 hylang 一起使用的示例。

【问题讨论】:

    标签: multiprocessing python-multiprocessing hy


    【解决方案1】:

    multiprocessing 文档中的第一个示例可以直译为 Hy,如下所示:

    (import multiprocessing [Pool])
    
    (defn f [x]
      (* x x))
    
    (when (= __name__ "__main__")
      (with [p (Pool 5)]
        (print (.map p f [1 2 3]))))
    

    【讨论】:

    • 这对你有用吗?当我尝试运行它时,我收到一个错误,表明子进程正在尝试将某些 Python 解析为 Hy:Traceback (most recent call last): File ".../bin/hy", line 8, in <module> sys.exit(hy_main()) File "<string>", line 1, in <module> NameError: name 'hyx_from' is not defined
    • @MarkReed import 语法适用于 Hy 的早期版本,在我写这个答案时是当代的。我已经对其进行了更新并确认它可以在 Hy master 上运行。
    • 对于 Python 3.9.6 和 Hy 0.20.0 或 1.0a3,这是行不通的。首先,导入缺少一组方括号;我的安装需要(import [multiprocessing [Pool]])。其次,在尝试执行示例时,我仍然会遇到`hyx_from` 的 NameError。
    • @MarkReed 0.20.0 和 1.0a3 都不是最新的。从 1.0a3 开始对导入语法进行了更改。
    • 同样,import 语法不是问题,启动新进程时 Hy 和 Python 源之间的不匹配是问题。这似乎是 macOS 特有的问题;在 Linux 下(例如,在 git repo 构建的 docker 映像中)它可以工作,但即使使用来自 github 的最新和最好的,在 Catalina 上本地运行也会产生一长串 NameError: name 'hyx_from' is not defined 消息。不过,依赖于操作系统似乎是一件奇怪的事情。
    【解决方案2】:

    请注意,直接翻译在 macOS 上会遇到问题(官方不支持,但大多数情况下仍然有效):Hy 将 sys.executable 设置为 Hy 解释器,multiprocessing 依赖该值来启动新进程.您可以通过调用(multiprocessing.set_executable hy.sys_executable) 来解决该特定问题,但随后它将无法解析包含 Hy 代码本身的文件,由于某种原因它在子进程中再次解析。因此,对于在 Mac 上本地运行的 Hy 使用多处理似乎没有一个好的解决方案。

    我想这就是我们拥有 Docker 的原因。

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 2023-02-16
      • 1970-01-01
      • 2021-05-22
      • 2012-03-04
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2020-07-03
      相关资源
      最近更新 更多