2013-08-07 2 views
2

У меня есть проект, который я пишу на Python, который будет отправлять аппаратные (Phidgets) команды. Поскольку я буду взаимодействовать с более чем одним аппаратным компонентом, мне нужно, чтобы одновременно выполнялось несколько циклов.Несколько петель python в том же процессе

Я исследовал модуль Python multiprocessing, но оказывается, что аппаратное обеспечение может управляться только одним процессом за раз, поэтому все мои петли должны запускаться в одном процессе.

На данный момент я смог выполнить свою задачу с помощью цикла Tk(), но без использования каких-либо инструментов графического интерфейса. Например:

from Tk import tk 

class hardwareCommand: 
    def __init__(self): 
     # Define Tk object 
     self.root = tk() 

     # open the hardware, set up self. variables, call the other functions 
     self.hardwareLoop() 
     self.UDPListenLoop() 
     self.eventListenLoop() 

     # start the Tk loop 
     self.root.mainloop() 


    def hardwareLoop(self): 
     # Timed processing with the hardware 
     setHardwareState(self.state) 
     self.root.after(100,self.hardwareLoop) 


    def UDPListenLoop(self): 
     # Listen for commands from UDP, call appropriate functions 
     self.state = updateState(self.state) 
     self.root.after(2000,self.UDPListenLoop) 


    def eventListenLoop(self,event): 
     if event == importantEvent: 
      self.state = updateState(self.event.state) 
     self.root.after(2000,self.eventListenLoop) 

hardwareCommand() 

Так в основном, единственная причина для определения цикла Tk() так, что я могу назвать команду root.after() в тех функциях, которые должны быть одновременно петельными.

Это работает, но есть ли у него лучший/более питонический способ сделать это? Мне также интересно, вызывает ли этот метод ненужные вычислительные накладные расходы (я не специалист по компьютерной науке).

Спасибо!

+0

loop in daemon thread – eri

+0

Возможно, подумайте о том, чтобы взглянуть на [gevent] (http://www.gevent.org/) – voithos

+1

Вы рассматривали потоки python (не многопроцессы?). Такие вещи, как блокировки и потоки, позволяют вам управлять несколько потоков и координировать их доступ к определенным частям оборудования и т. д. – chander

ответ

1

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

from threading import Thread 

class hardwareTasks(Thread): 

    def hardwareSpecificFunction(self): 
     """ 
     Example hardware specific task 
     """ 
     #do something useful 
     return 

    def run(self): 
     """ 
     Loop running hardware tasks 
     """ 
     while True: 
      #do something 
      hardwareSpecificTask() 


class eventListen(Thread): 

    def eventHandlingSpecificFunction(self): 
     """ 
     Example event handling specific task 
     """ 
     #do something useful 
     return 

    def run(self): 
     """ 
     Loop treating events 
     """ 
     while True: 
      #do something 
      eventHandlingSpecificFunction() 


if __name__ == '__main__': 

    # Instantiate specific classes 
    hw_tasks = hardwareTasks() 
    event_tasks = eventListen() 

    # This will start each specific loop in the background (the 'run' method) 
    hw_tasks.start() 
    event_tasks.start() 

    while True: 
     #do something (main loop) 

Вы должны проверить this article, чтобы получить больше знакомы с threading модулем. Его documentation тоже хорошо читается, поэтому вы можете изучить его полный потенциал.

+0

Отличное описание, спасибо! – user1636547

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