一、基本概念
1、並發和並行的區別
並發和並行是指計算機系統中多個任務的執行方式。並發是指兩個或多個任務使用交替的方式共享CPU時間,這些任務在同時發生但並不一定在同一時刻完成。並行是指兩個或多個任務在同一時刻發生,可以使用多個CPU核心同時處理這些任務。
Python提供了多種並發編程模塊,可以幫助實現高效的並發操作。
2、GIL(Global Interpreter Lock)
GIL是Python解釋器中的一種機制,它保證同一時刻只有一個線程執行 Python 代碼。這意味著Python不能利用多個 CPU 核心來執行任務。但是由於Python的大部分標準庫都是用C語言編寫的,因此多線程在I/O操作上還是具有優勢的。
二、常見的並發編程模塊
1、threading
threading模塊是Python中用於多線程編程的主要模塊,提供了Thread、Lock、Condition、Semaphore、Event等工具類,可以更方便地實現多線程編程。
import threading
def worker():
print('I am working')
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threads:
t.join()
2、multiprocessing
multiprocessing模塊是Python中用於多進程編程的主要模塊,使用起來與threading類似。
import multiprocessing
def worker():
print('I am working')
processes = []
for i in range(5):
p = multiprocessing.Process(target=worker)
processes.append(p)
p.start()
for p in processes:
p.join()
3、concurrent.futures
concurrent.futures模塊引入了Executor框架,可以簡化非同步程序的編寫過程,支持線程池和進程池兩種執行方式。
from concurrent.futures import ThreadPoolExecutor
def worker():
print('I am working')
with ThreadPoolExecutor(max_workers=5) as executor:
for i in range(5):
executor.submit(worker)
三、常用的並發編程技術
1、鎖(Lock)
多個線程同時讀取和修改同一個變數時,可能會出現數據競爭和互相干擾的問題。這時可以使用鎖來避免這些問題。
import threading
count = 0
lock = threading.Lock()
def worker():
global count
with lock:
for i in range(100000):
count += 1
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threads:
t.join()
print(count)
2、信號量(Semaphore)
信號量類似於鎖,但是允許多個線程同時讀取和修改同一個變數。
import threading
count = 0
semaphore = threading.Semaphore(5)
def worker():
global count
with semaphore:
for i in range(100000):
count += 1
threads = []
for i in range(10):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
for t in threads:
t.join()
print(count)
3、事件(Event)
事件可以用來協調多個線程的執行順序,可以在一個線程中發出信號,讓其他線程在符合條件時執行。
import threading
event = threading.Event()
def worker():
event.wait()
print('I am working')
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
event.set()
for t in threads:
t.join()
四、總結
Python提供了多種並發編程模塊和技術,可以幫助實現高效的並發操作。在選擇並發模塊和技術時,需要考慮到具體的應用場景和需求,以便選取最優的解決方案。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/236916.html