Nano Hash - криптовалюты, майнинг, программирование

Проблема с блокировкой при использовании Join() с Multiprocess

Я не понимаю, почему следующие блоки кода. Я пытаюсь просто зациклиться на заданное время, а затем отправить сообщение в поток, чтобы он остановился. Мой класс процесса выглядит следующим образом.

class Worker(multiprocessing.Process):
    def __init__(self, queue):
        multiprocessing.Process.__init__(self)
        self.queue = queue
        self.running = True

    def run(self):
        print 'entered run'
        while self.running:
            print 'thread time:', time.time()
            time.sleep(.6)
        print 'thread end'
        return 0

Довольно прямолинейно. Мой основной выглядит так:

if __name__ == '__main__':
    queue = Queue()
    p = Worker(queue)
    p.daemon = True
    p.start()
    time.sleep(3)
    p.running = False
    print 'Main end'

Итак, что я ожидаю от этой программы, так это запуск процесса, который будет выполнять свой собственный цикл наряду с основным. Пока это происходит, Main() будет спать в течение 3 секунд, а затем установит для условия цикла внутри рабочего процесса значение False, чтобы он вышел из цикла. Затем они оба печатают приятное сообщение «Готово», и программа завершает работу. Однако проблема в том, что поток main завершает работу до того, как процесс успевает отобразить свое сообщение.

Например, вывод выглядит так:

>> entered run
>> thread time: 1358444245.31
>> thread time: 1358444245.91
>> thread time: 1358444246.51
>> thread time: 1358444247.11
>> thread time: 1358444247.71
>> Main end

Итак, немного почитав, я вижу, что join() используется для блокировки, пока поток не завершит выполнение. После этого я добавляю вызов join() сразу после нарушения условия цикла в потоке. Я думаю, что это заблокирует main, пока процесс не успеет закрыться.

if __name__ == '__main__':
    queue = Queue()
    p = Worker(queue)
    p.daemon = True
    p.start()
    time.sleep(3)
    p.running = False
    p.join()          ## <------ New Line 
    print 'Main end'

Однако это ведет себя неожиданно. Как только я добавляю эту строку, поток никогда прекращает выполнение, и поэтому main блокируется на неопределенный срок. Вывод ниже будет вращаться в вечность.

>> entered run
>> thread time: 1358444362.44
>> thread time: 1358444363.04
>> thread time: 1358444363.64
>> thread time: 1358444364.24
>> thread time: 1358444364.84
>> thread time: 1358444365.44
>> thread time: 1358444366.04
>> thread time: 1358444366.64
>> thread time: 1358444367.24
>> thread time: 1358444367.84
>> thread time: 1358444368.44
>> thread time: 1358444369.04
>> thread time: 1358444369.64
>> thread time: 1358444370.24

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


  • См. раздел stackoverflow.com/questions/6359597/ для связи между потоками. через события. В вашем случае, я думаю (как и в других языках), вы, вероятно, видите кешированное значение используемого флага. 17.01.2013

Ответы:


1

Во-первых, multiprocessing.Process не создает Thread, он создает отдельный процесс, который будет выполнять предоставленную функцию.

Вам нужно будет использовать multiprocessing.Queue для передачи сообщений между двумя процессами.

Взгляните на: http://docs.python.org/2/library/multiprocessing.html#exchange-objects-between-processes

Как упомянул Макс Якимец, вы изменяете значения в первом процессе, но никогда не передаете сообщение второму.

Вместо изменения значения p.running вам нужно будет добавить элемент в очередь. В процессе вам нужно будет проверить, есть ли какие-либо сообщения, ожидающие в очереди, и отреагировать на них (завершить работу, сделать что-то еще и т. д.).

17.01.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..