我想從背景回調中執行我的代碼到主線程中。由於某些原因,我沒有找到簡單的例子來執行此操作。如何從另一個線程上調用的回調函數返回到主線程
我發現隊列和池的例子,這顯然不是我想要的。我只想加入主線程來執行我的功能。
下面是一些簡單的代碼:
def my_callback:
# this callback is called from a third party and I don't have control on it.
# But because of this, the function must_be_executed_on_main_thread is
# executed on the background.
must_be_executed_on_main_thread()
def must_be_executed_on_main_thread:
# must be executed on the main thread.
**編輯**
這裏是我的問題: 主文件:
if __main__ == '__main__'
sio = socketio.Server()
app = Flask(__name__)
app = socketio.Middleware(sio, app)
# now the thread is blocking into the server pool
eventlet.wsgi.server(eventlet.listen('', 7000)), app)
從另一個文件,我有一位處理插座事件的裝飾者:
@sio.on('test')
def test(sid, data):
print threading.currentThread()
sio.emit('event triggered')
這裏是問題:我有一些硬件按鈕觸發的事件,這會觸發一個稱爲sio「測試」事件的回調。但由於事件不會被觸發到同一個線程,這使我有些麻煩:
# async call !
def event_cb(num):
sio.emit('test')
GPIO.add_event_detect(btNumber, GPIO.RISING, event_cb)
的測試方法裝飾叫做: 但是當EMIT不是主線程上完成,這個停止工作。
只要套接字調用是從Mainthread就可以了。 但是當一個電話完成DummyThread,這不工作了。
我使用socket.io實現在客戶端設備上進行測試。只要「排出」在主線上完成,它就可以工作,但是當我在另一個線程上執行時(例如觸發回叫的按鈕,它將停止工作)
這就是爲什麼我喜歡執行
「停止工作」不是問題的明確描述。 如果你不想'wsgi.server'來阻塞主線程,請執行'eventlet.spawn(eventlet.wsgi.server,listen(...),app)'。不要忘記定期調用'eventlet.sleep(0)'以確保Eventlet主循環有機會處理網絡事件。 此外,您可以嘗試'monkey_patch(threading = True)',這樣總會有一個操作系統線程。 也要注意「按鈕反彈」(谷歌它)。使用按鈕的正確方法是使用Linux gpio-keys或通過採樣手動去除。 – temoto
根據性能要求,自己做循環(而不是由某個庫中的C)可能可行也可能不可行。它絕對會工作。 :) –