一、Python並發編程
Python並發編程是指在一台計算機上同時運行多個程序,以提高計算機的使用效率。在Python中,可以通過幾種不同的方式來實現並發編程,例如:多線程、多進程、協程等。在這些方法中,多線程是最常用和最方便的方式,因為它可以充分利用計算機的多核處理器。下面是一個使用多線程實現並發編程的示例。
import threading def job(num): print('Thread %s started' % threading.current_thread().name) for i in range(num): print(i) print('Thread %s ended' % threading.current_thread().name) threads = [] for i in range(4): t = threading.Thread(target=job, args=(5,)) threads.append(t) t.start() print('All threads started') for t in threads: t.join() print('All threads ended')
在以上代碼中,我們創建了4個線程,並且每個線程都執行了job函數。job函數中的for循環會輸出數字1到5。join()函數用於保證所有線程都運行完成後再繼續執行後面的代碼。
二、Python多進程編程
Python多進程編程是指在同一台計算機上同時運行多個進程,以提高計算機的使用效率。在Python中,可以通過multiprocessing模塊來實現多進程編程。下面是一個使用多進程實現並發編程的示例。
from multiprocessing import Process def job(name): print('Process %s started' % name) for i in range(5): print(i) print('Process %s ended' % name) if __name__ == '__main__': processes = [] for i in range(4): p = Process(target=job, args=(i,)) processes.append(p) p.start() print('All processes started') for p in processes: p.join() print('All processes ended')
在以上代碼中,我們創建了4個進程,並且每個進程都執行了job函數。job函數中的for循環會輸出數字1到5。join()函數用於保證所有進程都運行完成後再繼續執行後面的代碼。
三、Python協程編程
Python協程是一種輕量級的並發編程方式,可以在一個線程內同時執行多個協程任務,提高計算機的使用效率。在Python中,可以通過asyncio模塊來實現協程編程。下面是一個使用協程實現並發編程的示例。
import asyncio async def job(num): print('Coroutine started') for i in range(num): print(i) await asyncio.sleep(0.1) print('Coroutine ended') if __name__ == '__main__': loop = asyncio.get_event_loop() tasks = [loop.create_task(job(5)) for i in range(4)] loop.run_until_complete(asyncio.wait(tasks)) print('All coroutines ended')
在以上代碼中,我們創建了4個協程,並且每個協程都執行了job函數。job函數中的for循環會輸出數字1到5,同時每個數字輸出之間會暫停0.1秒鐘。wait()函數用於保證所有協程都運行完成後再繼續執行後面的代碼。
四、Python並行計算框架
Python有很多優秀的並行計算框架,例如:Dask、Ray、MPI、Joblib等。這些框架都可以很方便地實現並行計算任務,從而提升計算效率。下面是一個使用Dask框架實現並行計算任務的示例。
import dask.array as da import numpy as np x = np.random.random((10000, 10000)) y = da.from_array(x, chunks=(1000, 1000)) result = y.sum().compute() print(result)
在以上代碼中,我們使用numpy模塊生成一個10000*10000的隨機矩陣,並且通過from_array()函數將它轉換為Dask數組。我們設置了chunks參數為(1000, 1000),表示將矩陣分割為1000*1000的小塊進行計算。最後,我們使用sum()函數計算所有小塊的和,最終通過compute()函數將結果計算出來。
五、Python並發編程的注意事項
在進行Python並發編程時,有一些需要注意的事項:
- 多線程和多進程在某些情況下可能會不安全,需要使用鎖和信號量來進行同步。
- 協程在某些情況下可能會因為IO操作阻塞,需要使用asyncio模塊提供的異步IO功能。
- 並行計算框架需要根據具體的任務特點來選擇,例如:Dask適合處理大規模數據集,Joblib適合處理計算密集型任務。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/270877.html