Python 是一種面向對象、解釋型語言,支持多線程編程。Python 中,使用 threading 庫可以輕松地實現多線程。另外,Queue 模塊提供了多種隊列類,可用于線程間通信和協作。
線程是程序中執行的最小單位,它們共享同一個進程的資源,包括內存、文件、套接字等等。Python 的 threading 模塊支持多線程編程,允許開發人員創建和控制多個線程。
要創建一個線程,可以使用 threading.Thread 類。例如:
import threading def worker(): print('Thread %s is running' % threading.current_thread().name) t = threading.Thread(target=worker, name='MyThread') t.start()
代碼中,定義了一個 worker() 函數,用于打印當前線程的名稱。使用 threading.Thread 類創建一個線程對象 t,指定 target 參數為 worker,name 參數為 MyThread。調用 start() 方法啟動線程。
線程間的通信和協作可以使用 Queue 模塊提供的隊列類。Python 中,Queue 模塊提供了多種隊列類,包括 Queue、LifoQueue 和 PriorityQueue。其中,Queue 是普通隊列,LifoQueue 是后進先出隊列,PriorityQueue 是優先級隊列。隊列支持多線程讀寫操作,可以用于在線程間傳遞數據。
下面是一個使用 Queue 類實現線程間通信的例子:
import queue import threading def producer(q): for i in range(10): q.put(i) print('Producer puts %d to queue' % i) def consumer(q): while True: i = q.get() if i is None: break print('Consumer gets %d from queue' % i) q = queue.Queue() t1 = threading.Thread(target=producer, args=(q,)) t2 = threading.Thread(target=consumer, args=(q,)) t1.start() t2.start() t1.join() q.put(None) t2.join()
代碼中,定義了 producer() 和 consumer() 兩個函數,分別用于向隊列添加數據和從隊列取出數據。使用 queue.Queue() 創建一個隊列 q,創建兩個線程 t1 和 t2,分別調用 producer() 和 consumer() 函數,并傳入隊列參數 q。調用 t1.start()、t2.start() 啟動線程,并使用 t1.join()、t2.join() 等待線程執行完畢。
Queue 模塊提供的隊列類是線程安全的,意味著多個線程可以同時讀寫隊列,而不會出現競爭問題。但這并不代表程序一定安全,可能會出現死鎖、編程錯誤等問題,因此必須小心使用。