Я пытался узнать, как многопроцессор работает в python, и создал очень простой скрипт для проверки моего понимания.Пока цикл прерывает передачу значений переменной в процессе python
Все, кажется, работает нормально, за исключением того факта, что в процессе ни один из присваиваний значений, которые происходят после цикла while, не завершается.
Если я заменю цикл while циклом for или полностью удаляю его, все будет работать так, как ожидалось.
Вот main.py:
from timepieces import Stopwatch
def run():
watch = Stopwatch()
watch.start()
can_count = 0 if (raw_input('Press q to stop and see seconds counted') == 'q') else 1
watch._can_count.value = can_count
print watch.get_seconds()
if __name__ == "__main__":
run()
И timepieces.py файл (содержит класс, который создает и управляет процессом):
from multiprocessing import Process, Value
import time
import math
class Stopwatch:
_count_val = None
_proc = None
_can_count = None
def count_seconds(self, can_count, count_val):
seconds = 0
count_val.value = 23
#print can_count.value == 1
while can_count.value == 1:
seconds += 1
count_val.value = seconds
def start(self):
self._count_val = Value('i', 0)
self._can_count = Value('i', 1)
self._proc = Process(target = self.count_seconds, args = (self._can_count, self._count_val))
self._proc.start()
def get_seconds(self):
return self._count_val.value
Любые мысли приветствуются.
Приветствия, но есть ли причина, по которой вы передаете _do_count и переменные _count в функцию, а затем просто вызываете их через ссылку на класс? Я бы предположил, что если вы используете self._do_count, вам не нужно передавать его в качестве аргумента. – achillesminor
@achillesminor Хорошее место. Ответ - нет, этот бит лишний. С моей стороны это просто неуклюжесть. Я отредактировал свой ответ, чтобы удалить нарушающий код. – Steve
Прохладный; снова, спасибо за своевременный ответ! – achillesminor