немедленно завершить процесс

Рассмотрим следующий код:

process := [ (Delay forSeconds: 10) wait ] 
    forkAt: Processor userBackgroundPriority.
process terminate.
process isTerminated. "--> false"
process resume. "process has been suspended but not terminated"
(Delay forSeconds: 10) wait.
process isTerminated "--> true"

Как видите, процесс не завершится до тех пор, пока блок не будет оценен (т. е. в данном случае через десять секунд).

Есть ли способ немедленно завершить процесс? Кроме того: кто-нибудь знает, почему блок оценивается в первую очередь?

Изменить: я понимаю, почему оценивается блок. Проблема с приведенным выше кодом, конечно же, заключается в том, что я пытаюсь завершить процесс до того, как он станет активным. Тем не менее, что, если я не хочу ждать, пока истечет отсрочка?


person Max Leske    schedule 17.10.2012    source источник
comment
после второго ожидания слишком много ']'   -  person Damien Cassou    schedule 17.10.2012


Ответы (1)


После отправки terminate ваш процесс приостанавливается (проверьте отправкой isSuspended), поэтому он не будет запущен, пока не будет возобновлен. Вы получаете false из isTerminated, потому что процесс еще не успел запуститься (посмотрите на исходный код isTerminated, чтобы понять, почему).

Таким образом, на самом деле ваш процесс неактивен и будет правильно собран мусором, как только вы отпустите ссылку, которая для ваших целей должна быть так же хороша, как «завершена».

(Отказ от ответственности: я смотрел код Squeak, а не Pharo, но эта часть системы должна быть почти такой же)

person Vanessa Freudenberg    schedule 17.10.2012
comment
Имеет смысл. Код в Squeak и Pharo, кажется, почти идентичен. Если я могу положиться на GC, то также возможно завершение во время выполнения задержки (задержка будет приостановлена). Однако один вопрос: слабы ли очереди процессов? Их ссылка на процесс не должна мешать GC; Я не нашел, где инициализируется переменная экземпляра quiescentProcessLists из ProcessorScheduler. - person Max Leske; 18.10.2012
comment
Списки процессов не являются слабыми, но для приостановки требуется процесс из этих списков. Там только запущенные процессы. quiescentProcessLists никогда не инициализируется, он был инициализирован один раз в 1996 году или даже раньше. Squeak всегда работает и просто временно приостанавливается в середине операций, когда его записывают на диск и возобновляют. В отличие от большинства других систем, она никогда не перезапускается с нуля. - person Vanessa Freudenberg; 18.10.2012
comment
Я должен был догадаться :) Спасибо! - person Max Leske; 19.10.2012