У меня есть проект, который я пишу на 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()
в тех функциях, которые должны быть одновременно петельными.
Это работает, но есть ли у него лучший/более питонический способ сделать это? Мне также интересно, вызывает ли этот метод ненужные вычислительные накладные расходы (я не специалист по компьютерной науке).
Спасибо!
loop in daemon thread – eri
Возможно, подумайте о том, чтобы взглянуть на [gevent] (http://www.gevent.org/) – voithos
Вы рассматривали потоки python (не многопроцессы?). Такие вещи, как блокировки и потоки, позволяют вам управлять несколько потоков и координировать их доступ к определенным частям оборудования и т. д. – chander