2014-12-27 4 views
1

мне нужно знать, если его можно запустить цикл, а внутри скрученной WebSocket основного контураPython - внутри цикла внутри витой основной петли?

им в то время как цикл в виду это Lib вы видите в этом вопросе: shout-python segmentation fault how can I fix this?

все, что мне нужно это сделать отправляет новый заголовок после его обновления, хотя я могу справиться с этой частью. Его значение while self.running: в функции play(). Если вы можете помочь, я буду очень благодарен.

+0

Я думал о том, чтобы проверить его, но я не хотел, чтобы сразу два процесса – Michael

ответ

2

Для однопоточной, совместной многозадачной системы Twisted для работы в лучшем случае важно, чтобы какая-либо конкретная часть кода, работающая в реакторной нити, не работала слишком долго, не давая контроль обратно в реактор. Пока в этом потоке работает какой-либо один фрагмент кода, в этом потоке не работает другой код. В однопоточной совместной совместной многозадачной системе, которая означает, что другие события не обслуживаются.

В зависимости от вашего приложения, может случиться, что один кусок кода будет работать без отказа от контроля в течение многих миллисекунд, много секунд, возможно даже минут. Это полностью зависит от того, какие события ваше приложение отвечает за обработку и какой уровень реагирования вы хотите получить от него. При написании кода библиотеки общего назначения для такой системы большинство людей предполагает, что только нормально запускать код для одной задачи за несколько миллисекунд или раньше, прежде чем отказаться от контроля - ошибиться на стороне, пригодной для использования в более приложений, а не меньше (хотя люди редко рассматривают точный временной интервал, в основном операции разделяются на «довольно быстро» и все остальное).

То, что почти всегда неприемлемо, состоит в том, чтобы пропустить единый код без ограничений, не возвращаясь обратно в реактор. Цикл в ответе, к которому вы привязаны, фактически бесконечен, и поэтому он будет удерживать контроль в течение произвольно длительного периода времени (возможно, для большей части времени выполнения программы). Есть немного, если какие-либо приложения могут терпеть это, потому что результат состоит в том, что другие события никогда не будут обработаны. Если ваше приложение не может реагировать на какие-либо события, в то время как он проводит все время работы, работая над одной задачей, вам может не понадобиться многозадачная система вообще (например, вам может не понадобиться Twisted, вы можете просто используйте цикл while).

Петля в этом ответе в основном представляет собой «процесс обработки некоторых данных как можно быстрее». Существует несколько вариантов реализаций такого рода работ, которые более дружественны к многозадачности.

Один из способов - буквальный перевод петли в образец, дружественный реактору. Вы можете сделать это с помощью генератора:

from twisted.internet.task import cooperate 

class Audio(object): 
    def play(self): 
     # ... setup stuff ... 
     while self.running: 
      # ... one chunk of work ... 
      yield 

def main(): 
    ... 
    cooperate(Audio().play()) 

cooperate принимает итератор и итерацию над ним - но не все сразу. Он несколько раз повторяет его, а затем отказывается от контроля в реакторе. Затем он повторяет его несколько раз, а затем снова отказывается от контроля. Это продолжается до тех пор, пока итератор не будет исчерпан (или реактор остановлен).

Другой чуть менее буквальный перевод основан на LoopingCall, который берет на себя ответственность за создание циклов, оставляя вам только снабжать телом цикла:

from twisted.internet.task import LoopingCall 

class Audio(object): 
    def play(self): 
     # ... setup stuff ... 

     LoopingCall(self._play_iteration).start(0) 

    def _play_iteration(self): 
     # ... one chunk of work 

Это дает вам контроль над скоростью, при которой цикл повторяется. В этом примере 0, переданный в start, означает «как можно быстрее» (подождите 0 секунд между итерациями), оставаясь вместе с остальной частью системы. Если вам нужна одна итерация в секунду, вы пройдете 1 и т. Д.

Еще один вариант - использовать абстракцию потока данных - например, родную систему производителя/потребителя Twisted или новую библиотеку tubes - для создания многозадачных протоколов обработки данных, которые являются дополнительными абстракциями от конкретных «прочитанных, process "в связанном ответе.

Смежные вопросы