假設: thread....start() 阻塞直到 start 完成。
問題:假設是真還是假?
啟動http web server然后打開瀏覽器有以下代碼。
import sys
import time
import threading
import webbrowser
from http.server import HTTPServer, SimpleHTTPRequestHandler
ip = "127.0.0.1"
port = 3600
url = f"http://{ip}:{port}"
def start_server():
server_address = (ip, port)
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
httpd.serve_forever()
threading.Thread(target=start_server).start()
webbrowser.open_new(url)
while True: # make a blocker to prevent the application finish of execute:
try:
time.sleep(1)
except KeyboardInterrupt:
sys.exit(0)
這作業正常。但是,以下也有效。
import sys
import time
import threading
import webbrowser
from http.server import HTTPServer, SimpleHTTPRequestHandler
ip = "127.0.0.1"
port = 3600
url = f"http://{ip}:{port}"
def start_server():
server_address = (ip, port)
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
httpd.serve_forever()
threading.Thread(target=start_server).start()
webbrowser.open_new(url)
假設: thread....start() 實際上會阻塞,直到 start 完成。因此,webbrowser.open_new(url)在啟動完成之前不會執行。從而使以下內容變得不必要。
while True: # make a blocker to prevent the application finish of execute:
try:
time.sleep(1)
except KeyboardInterrupt:
sys.exit(0)
經過廣泛的搜索,我無法證明或反駁該假設。
uj5u.com熱心網友回復:
Thread.start()以您建議的方式呼叫時沒有阻塞。從某種意義上說,呼叫是阻塞的,即呼叫會初始化新執行緒內部狀態,并進行系統呼叫以啟動實際的作業系統執行緒 - 但這應該不到 1 毫秒。作為執行緒目標的函式僅在新執行緒上呼叫,主執行緒將繼續運行,無論該函式內部發生了什么。
如果您不希望您的程式結束,則無需像您設定的那樣使用復雜的暫停回圈 - 只需呼叫即可threading.join()。這將阻塞,直到所有其他執行緒結束運行,只有它們執行緒呼叫join()才會繼續。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382687.html
下一篇:如何合并每個執行緒結果-java
