3 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
需要記住的一件事是,每個(gè)線程都是單個(gè)代碼流的順序執(zhí)行,從線程啟動(dòng)的函數(shù)開始。簡(jiǎn)單地在現(xiàn)有線程上運(yùn)行某些內(nèi)容沒(méi)有多大意義,因?yàn)樵摼€程已經(jīng)在執(zhí)行某些內(nèi)容,并且這樣做會(huì)破壞它的當(dāng)前流程。
然而,線程之間的通信非常容易,并且可以實(shí)現(xiàn)線程的代碼,使其僅從其他線程接收函數(shù)/事件來(lái)告訴它要做什么。這通常稱為事件循環(huán)。
例如你的主線程可能看起來(lái)像這樣
from queue import Queue
tasks = Queue()
def event_loop():
while True:
next_task = tasks.get()
print('Executing function {} on main thread'.format(next_task))
next_task()
在其他線程中,您可以通過(guò)簡(jiǎn)單地將函數(shù)添加到隊(duì)列中來(lái)要求主線程運(yùn)行該函數(shù)tasks:
def listenReply(self):
while self.SOCK_LISTENING:
fromNodeRED = self.nodeRED_sock.recv(1024).decode()
if fromNodeRED=="closeDoor":
tasks.put(door_closed)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
我自己使用 PyQt 的信號(hào)和插槽解決了這個(gè)問(wèn)題。
class App(QWidget):
socketSignal = QtCore.pyqtSignal(object) #must be defined in class level
# BG THREAD
def listenReply(self):
while self.SOCK_LISTENING:
fromNodeRED = self.nodeRED_sock.recv(1024).decode()
print(fromNodeRED)
self.socketSignal.emit(fromNodeRED)
....主線程 init 中的某處:
self.socketSignal.connect(self.executeOnMain)
self.listenThread = Thread(target=self.listenReply, daemon=True)
self.SOCK_LISTENING = True
self.listenThread.start()
....
def executeOnMain(self, data):
if data=="closeDoor":
self.door_closed() # a method that changes the UI
對(duì)我來(lái)說(shuō)效果很好。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
threading.Event()每當(dāng)您收到來(lái)自 的“closeDoor”消息時(shí),您都可以使用和設(shè)置它recv。
例如:
g_should_close_door = threading.Event()
def listenReply(self):
while self.SOCK_LISTENING:
fromNodeRED = self.nodeRED_sock.recv(1024).decode()
if fromNodeRED=="closeDoor":
g_should_close_door.set()
...
self.listenThread = Thread(target=self.listenReply, daemon=True)
self.SOCK_LISTENING = True
self.listenThread.start()
if g_should_close_door.is_set():
door_closed()
g_should_close_door.clear()
添加回答
舉報(bào)