【发布时间】:2019-06-05 17:11:10
【问题描述】:
我正在寻找一个将 python 多处理(即进程池/线程池、作业队列等)与 hylang 一起使用的示例。
【问题讨论】:
标签: multiprocessing python-multiprocessing hy
我正在寻找一个将 python 多处理(即进程池/线程池、作业队列等)与 hylang 一起使用的示例。
【问题讨论】:
标签: multiprocessing python-multiprocessing hy
multiprocessing 文档中的第一个示例可以直译为 Hy,如下所示:
(import multiprocessing [Pool])
(defn f [x]
(* x x))
(when (= __name__ "__main__")
(with [p (Pool 5)]
(print (.map p f [1 2 3]))))
【讨论】:
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
import 语法适用于 Hy 的早期版本,在我写这个答案时是当代的。我已经对其进行了更新并确认它可以在 Hy master 上运行。
(import [multiprocessing [Pool]])。其次,在尝试执行示例时,我仍然会遇到`hyx_from` 的 NameError。
import 语法不是问题,启动新进程时 Hy 和 Python 源之间的不匹配是问题。这似乎是 macOS 特有的问题;在 Linux 下(例如,在 git repo 构建的 docker 映像中)它可以工作,但即使使用来自 github 的最新和最好的,在 Catalina 上本地运行也会产生一长串 NameError: name 'hyx_from' is not defined 消息。不过,依赖于操作系统似乎是一件奇怪的事情。
请注意,直接翻译在 macOS 上会遇到问题(官方不支持,但大多数情况下仍然有效):Hy 将 sys.executable 设置为 Hy 解释器,multiprocessing 依赖该值来启动新进程.您可以通过调用(multiprocessing.set_executable hy.sys_executable) 来解决该特定问题,但随后它将无法解析包含 Hy 代码本身的文件,由于某种原因它在子进程中再次解析。因此,对于在 Mac 上本地运行的 Hy 使用多处理似乎没有一个好的解决方案。
我想这就是我们拥有 Docker 的原因。
【讨论】: