Многопроцессорная обработка Python выходит из ошибки

Можно использовать Цвет. FromName ()

6
задан Jon 6 August 2009 в 18:47
поделиться

2 ответа

_cancelled должен быть изменчивым . (если вы не выбрали блокировку)

Если один поток изменяет значение _cancelled , другие потоки могут не увидеть обновленный результат.

Кроме того, я думаю, что операции чтения / записи _cancelled являются атомарными :

Раздел 12.6.6 спецификации CLI гласит: "Соответствующий интерфейс командной строки должен гарантировать, что доступ для чтения и записи к правильному выровненные ячейки памяти не больше чем исходный размер слова атомарен когда все записи обращаются к При рисовании пунктирных линий вы можете варьировать расстояние между штрихами, чтобы убедиться, что у вас никогда не будет частичных четырехугольников на конечных точках. Это может визуально отвлекать, так как расстояние будет регулироваться в зависимости от длины сегмента.

редактировать:

А, картинка помогает. Я предполагаю, что, поскольку это на iPhone, вы получаете серию точек, из которых линии между ними дают приемлемую кривую. Если это так, использование примитивов сплайнов / кривых, вероятно, излишне. Я бы, вероятно, подошел к рисованию линий, как показано, просто путем рисования четырехугольников в каждой точке данных, которая находится на заданном расстоянии от последней точки данных.

Алгоритм будет примерно таким:

  1. Нарисовать четырехугольник на первой точке данных (с соответствующим поворотом)
  2. Перемещайтесь по списку точек, пока не « Мы установили обработчик сигналов для 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()
    
5
ответ дан 17 December 2019 в 04:50
поделиться

Я видел это, но оно исчезло, когда я заменил обработчики сигналов своими собственными. Используйте response.run (installSignalHandlers = False) и определите свои собственные функции для SIGINT, SIGTERM и т. Д.

0
ответ дан 17 December 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: