Потоки Tcl не обмениваются данными (если вы явно не используете определенные средства из пакета Thread), а вместо этого общаются посредством передачи сообщений. Таким образом, похоже, что можно было бы настроить выделенный поток «регистратора» и просто поставить в него сообщения журнала из рабочих потоков.
В противном случае спорная точка, вероятно, будет где-то в ресурсе ОС, используемом регистратором для фактической записи данных.
Обновление. Вот рабочий набросок того, что я на самом деле предлагал реализовать:
package require Tcl 8.5
package require Thread
proc make_worker_thread {logger_id body} {
set newbody [list set ::logger $logger_id]
append newbody \n {
proc ::log {severity msg} {
global logger
thread::send $logger [list ::log $severity $msg]
}
} \n $body
thread::create $newbody
}
set logger [thread::create {
package require logger
proc log {severity msg} {
puts "hey, that's it: ($severity) $msg"
}
puts "logger thread created: [thread::id]"
thread::wait
}]
for {set i 0} {$i < 3} {incr i} {
make_worker_thread $logger {
proc post_msg {} {
log notice "A message from [thread::id]"
after 1000 ::post_msg
}
puts "worker thread created: [thread::id]"
after 1000 ::post_msg
thread::wait
}
}
vwait forever
Этот код создает один поток регистратора и четыре рабочих потока, каждый из которых отправляет сообщение потоку регистратора один раз в секунду. Код выполняется до тех пор, пока не будет прерван вручную. Поток регистратора просто выводит сообщение, которое оно было передано в консоль, но, как уже упоминал кто-то другой в этом потоке, вы, вероятно, могли бы использовать пакет "logger" от Tcllib, если вам нужны необычные вещи, такие как средства.
Повторюсь:
- Сам пакет регистратора, по-видимому, ничего не знает о многопоточности.
- Потоки Tcl хорошо разделены и обычно общаются посредством передачи сообщений.
- Следовательно, создайте поток для регистратора и научите рабочие потоки отправлять ему сообщения; поэтому рабочие потоки не заботятся о том, как реализован регистратор.
P.S. В рабочих потоках вы можете использовать [thread::send -async ...]
, чтобы сделать отправку сообщений журнала полностью асинхронной.
person
kostix
schedule
07.11.2011