Python через prctl ( https://pypi.python.org/pypi/python-prctl) позволяет задать имя потока так, чтобы вы могли видеть его в программе 'htop'. Как это сделать в SBCL? BT: MAKE-THREAD не предоставляет интерфейс, и SBCL, похоже, тоже. Функция SB-THREAD :: MAKE-THREAD создает defstruct, определенный в sbcl / src / code / thread.lisp, который не имеет кода, связанного с этим afaict).

См. Также: Имя потока Python не отображается на ps или htop

2
Gabriel Laddel 19 Апр 2016 в 12:35

2 ответа

Лучший ответ

Сделайте это с помощью старой версии OSICAT-POSIX. Пытаться

(setf (osicat:process-name) "phuctor")

Это установит текущее имя потока.

1
Gabriel Laddel 2 Май 2016 в 04:29

Ошибка SBCL "имя потока отображается в htop" об этом с помощью предлагаемое решение от Томаса Хлаваты, не требующее исправлений SBCL:

(defun set-native-thread-name (thread name)
  #+(and sb-thread linux)
  (when (and (stringp name) (not (equal "" name)))
    (let ((n (with-output-to-string (s)
               (dotimes (i (min (length name) 15))
                 (let ((c (char name i)))
                   (if (<= 32 (char-code c) 126)
                       (write-char c s)
                       (return-from set-native-thread-name)))))))
      (with-alien ((fn (function integer unsigned c-string)
                       :extern "pthread_setname_np"))
        (values (alien-funcall fn
                               (sb-thread::thread-os-thread thread)
                               n))))))

(defun update-native-thread-names ()
  #+sb-thread
  (dolist (x (sb-thread:list-all-threads))
    (set-native-thread-name x (sb-thread:thread-name x))))

(defun set-thread-name (name &optional thread)
  #+sb-thread
  (let ((thread (or thread sb-thread:*current-thread*)))
    (setf (sb-thread:thread-name thread) name)
    (set-native-thread-name thread name)))

;; example
(sb-thread:make-thread
 (lambda ()
   (set-thread-name "ahoj")
   (sleep 10)
   ;; see the thread name in htop
   (print :done)
   (finish-output)))
1
Traut 6 Янв 2019 в 10:28