_cancelled
должен быть изменчивым
. (если вы не выбрали блокировку)
Если один поток изменяет значение _cancelled
, другие потоки могут не увидеть обновленный результат.
Кроме того, я думаю, что операции чтения / записи _cancelled
являются атомарными :
Раздел 12.6.6 спецификации CLI гласит: "Соответствующий интерфейс командной строки должен гарантировать, что доступ для чтения и записи к правильному выровненные ячейки памяти не больше чем исходный размер слова атомарен когда все записи обращаются к При рисовании пунктирных линий вы можете варьировать расстояние между штрихами, чтобы убедиться, что у вас никогда не будет частичных четырехугольников на конечных точках. Это может визуально отвлекать, так как расстояние будет регулироваться в зависимости от длины сегмента.
редактировать:
А, картинка помогает. Я предполагаю, что, поскольку это на iPhone, вы получаете серию точек, из которых линии между ними дают приемлемую кривую. Если это так, использование примитивов сплайнов / кривых, вероятно, излишне. Я бы, вероятно, подошел к рисованию линий, как показано, просто путем рисования четырехугольников в каждой точке данных, которая находится на заданном расстоянии от последней точки данных.
Алгоритм будет примерно таким:
- Нарисовать четырехугольник на первой точке данных (с соответствующим поворотом)
- Перемещайтесь по списку точек, пока не « Мы установили обработчик сигналов для SIGINT, и ваша программа получает этот сигнал, она прерывает системный вызов для выполнения вашего обработчика сигнала, а waitpid завершает работу, указывая, что он был прерван сигналом. Python обрабатывает этот случай с помощью исключений.
В качестве обходного пути вы можете заключить проблемные разделы в цикл while и блоки try / catch, подобные этому, либо там, где вы ждете завершения потоков, либо подкласс multiprocessing.Popen:
import errno from multiprocessing import Process p = Process( target=func, args=stuff ) p.start() notintr = False while not notintr: try: p.join() # "Offending code" notintr = True except OSError, ose: if ose.errno != errno.EINTR: raise ose
Для работы с multiprocessing.forking.Popen вам нужно будет сделать что-то вроде этого:
import errno from multiprocessing import Process from multiprocessing.forking import Popen import os # see /path/to/python/libs/multiprocessing/forking.py class MyPopen(Popen): def poll(self, flag=os.WNOHANG): # from forking.py if self.returncode is None: # from forking.py notintr = False while not notintr: try: pid, sts = os.waitpid(self.pid, flag) # from forking.py notintr = True except OSError, ose: if ose.errno != errno.EINTR: raise ose # Rest of Popen.poll from forking.py goes here p = Process( target=func args=stuff ) p._Popen = p p.start() p.join()
Я видел это, но оно исчезло, когда я заменил обработчики сигналов своими собственными. Используйте response.run (installSignalHandlers = False) и определите свои собственные функции для SIGINT, SIGTERM и т. Д.