Lparallel пакет коммутации в потоках - PullRequest
1 голос
/ 01 апреля 2019

Используя библиотеку Lparallel для Common Lisp, вы можете запустить параллельный поток, вызвав (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}>)

1 Ответ

3 голосов
/ 01 апреля 2019

Поведение по умолчанию для динамических переменных заключается в том, что только потоки в глобальной среде (т.е. не динамическая повторная привязка) совместно используются потоками.

Значение *package*в основном не имеет значения во время выполнения, за исключением случая, когда read ing (что необычно во время выполнения, и вы все равно явно связываете *package* для этого).Таким образом, нет причин отклоняться от стандартного поведения, описанного выше.

Нет также никакой связи между кодом (например, функцией) и пакетом, значение которого было *package*, когда он был прочитан, скомпилирован,или загружен.Единственный эффект *package* - это пакет по умолчанию для интернирования, поиска или печати символов.

...