我已经尝试了以下两种方法在我的项目中做了一些事情,我首先使用了线程并且它有点工作但是当我尝试使用多处理它时却没有。
下面显示的代码部分对应于X Class的 init 块内定义的功能。
这是使用线程完成的代码:
def Exec_Manual():
while True:
for i in range(0,5):
if self.rbtnMan.isChecked():
if self.rbtnAuto.isChecked():#This is another radio button.
break
self._tx_freq1_line_edit.setEnabled(1)
self._tx_freq2_line_edit.setEnabled(1)
self._tx_freq3_line_edit.setEnabled(1)
self._tx_freq4_line_edit.setEnabled(1)
self._tx_freq5_line_edit.setEnabled(1)
frec = 'self._tx_freq'+str(i+1)+'_line_edit.text()'
efrec = float(eval(frec))
self.lblTx1.setText(str(efrec-0.4))
self.lblTx2.setText(str(efrec))
self.lblTx3.setText(str(efrec+0.4))
#print frec
print efrec
time.sleep(1)
manual_thread = threading.Thread(target=Exec_Manual)
manual_thread.daemon = True
manual_thread.start()
这是用线程完成的代码:
def Exec_Manual():
while True:
for i in range(0,5):
if self.rbtnMan.isChecked():
if self.rbtnAuto.isChecked():
break
self._tx_freq1_line_edit.setEnabled(1)
self._tx_freq2_line_edit.setEnabled(1)
self._tx_freq3_line_edit.setEnabled(1)
self._tx_freq4_line_edit.setEnabled(1)
self._tx_freq5_line_edit.setEnabled(1)
frec = 'self._tx_freq'+str(i+1)+'_line_edit.text()'
efrec = float(eval(frec))
self.lblTx1.setText(str(efrec-0.4))
self.lblTx2.setText(str(efrec))
self.lblTx3.setText(str(efrec+0.4))
#print frec
print efrec
time.sleep(1)
proceso_manual = multiprocessing.Process(name='txmanual', target=Exec_Manual)
proceso_manual.daemon = True
proceso_manual.start()
基本上,当使用多处理时,它不会设置标签的文本或更改lineedits的Enabled状态。 ¿我怎么能实现这个目标?
很抱歉,如果我以无知的方式打扰你,请所有的帮助都会对TIA有用。
答案 0 :(得分:1)
这是预期的行为。
线程在相同的内存空间中运行;流程拥有自己。如果启动新进程,则无法更改其父进程的内存。与进程通信的唯一方法是IPC,基本上是网络或Unix套接字。
此外,您可以暂停和重新启动线程,例如通过使用同步原语(锁和信号量)并从线程函数检查它们。还有less nice方式,我真的不推荐。所以,我宁愿坚持同步原语。
说到IPC,它比同步线程更麻烦,更昂贵。它是围绕套接字构建的,因此与同一台机器上的进程通信几乎和在世界另一端与另一台机器通信一样麻烦。幸运的是,有很多协议和库提供套接字抽象,使其不那么繁琐(dbus就是一个很好的例子)。
最后,如果您真的喜欢分散处理的想法,那么查看消息队列和工作人员可能是有意义的。这基本上与IPC相同,但抽象到更高的级别。例如。您可以运行进程以在一台计算机上对任务进行排队,对另一台计算机执行处理,然后将结果返回到原始程序(或另一台计算机/进程)。这里一个流行的例子可能是AMPQ,RabbitMQ或Celery。