gpt4 book ai didi

multithreading - 线程中的并行包切换

转载 作者:行者123 更新时间:2023-12-03 13:18:53 25 4
gpt4 key购买 nike

使用 Common Lisp 的 Lparallel 库,您可以通过调用 (submit-task channel function) 启动并行线程运行。 .这将在一个新的并行线程中执行给定的函数。但是,该函数似乎总是在 :cl-user 包中运行,而不是在其中定义它的包中。我只是想知道为什么 Lparallel 是这样设计的。您可以通过包含 (in-package :my-package) 来覆盖在函数中,但是这种可预测性有什么好处吗?

#-:lparallel
(ql:quickload :lparallel)

(defpackage :test (:use :cl :lparallel))

(in-package :test)

(defun main ()
(setf lparallel:*kernel* (lparallel:make-kernel 1))
(print *package*)
(let ((c (make-channel)))
(submit-task c (lambda () (print *package*))))
(lparallel:end-kernel))

给出:
* (load "d:\\test.lisp")
To load "lparallel":
Load 1 ASDF system:
lparallel
; Loading "lparallel"

T
* (in-package :test)
#<PACKAGE "TEST">
* (main)

#<PACKAGE "TEST">
#<PACKAGE "COMMON-LISP-USER">
(#<SB-THREAD:THREAD "lparallel kernel shutdown manager" FINISHED values: NIL {1005873953}>
#<SB-THREAD:THREAD "lparallel" FINISHED values: NIL {10058735F3}>)

最佳答案

动态变量的默认行为是只有全局环境中的绑定(bind)(即不是动态重新绑定(bind))在线程之间共享。
*package* 的值在运行时几乎不相关,除非 read ing (这在运行时是不寻常的,无论如何你都会显式地绑定(bind) *package* )。因此没有理由偏离上述标准行为。

代码(例如函数)和作为 *package* 值的包之间也没有任何联系。当它被读取、编译或加载时。 *package*的唯一效果|是实习、查找或打印符号时的默认包。

关于multithreading - 线程中的并行包切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55447424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com