python線程安全及多進程多線程實現(xiàn)方法詳解
進程和線程的區(qū)別
- 進程是對運行時程序的封裝,是系統(tǒng)資源調(diào)度和分配的基本單位
- 線程是進程的子任務(wù),cpu調(diào)度和分配的基本單位,實現(xiàn)進程內(nèi)并發(fā)。
- 一個進程可以包含多個線程,線程依賴進程存在,并共享進程內(nèi)存
什么是線程安全
一個線程的修改被另一個線程的修改覆蓋掉。
python中哪些操作是線程安全的
- 一個操作可以在多線程環(huán)境中使用,并且獲得正確的結(jié)果。
- 線程安全的操作線程是順序執(zhí)行的而不是并發(fā)執(zhí)行的。
- 一般涉及到寫操作需要考慮如何讓多個線程安全訪問數(shù)據(jù)。
線程同步的方式
- 互斥量(鎖): 通過互斥機制防止多個線程同時訪問公共資源。
- 信號量(Semphare): 控制同一時刻多個線程訪問同一個資源的線程數(shù)。 ps:python的threading 文檔
- 事件(信號): 通過通知的方式保持多個線程的同步。
進程間的通信方式 (IPC:Inter-Process Communication 進程間傳遞信號或者數(shù)據(jù))
- 管道/匿名管道/有名管道(pipe)
- 信號(Signal):比如用戶使用ctrl+c產(chǎn)生SIGINT程序終止信號
- 消息隊列(Message)
- 共享內(nèi)存(share memory)
- 進程間的信號量(Semaphore)
- 套接字(socket):最常用的方式,我們的web應(yīng)用就是這種方式
多線程的例子
# python實現(xiàn)多線程 import threading lock = threading.Lock() n = [0] def foo(): with lock: # 加鎖 n[0] = n[0] + 1 n[0] = n[0] + 1 threads = [] # 用來儲存所有線程 for i in range(5000): t = threading.Thread(target=foo) # 傳入foo函數(shù) threads.append(t) for t in threads: t.start() print(n)
多進程的例子
python有GIL,可以用多進程實現(xiàn)cpu密集程序
- multiprocessing 多進程模塊
- multiprocessing.Process 類實現(xiàn)多進程
- 一般在cpu密集的程序里面使用多進程,避免GIL的影響
# 多進程 import multiprocessing def fib(n): if n<= 1: return 1 return fib(n-1) + fib(n-2) if __name__ == '__main__': jobs = [] for i in range(10,20): p = multiprocessing.Process(target=fib, args=(i,)) jobs.append(p) p.start()
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)解壓當天創(chuàng)建的ZIP文件到指定文件夾中
這篇文章主要為大家詳細介紹了Python如何實現(xiàn)解壓當天創(chuàng)建的ZIP文件到指定文件夾中,文中的示例代碼講解詳細,需要的小伙伴可以參考下2024-03-03Python中byte字符串轉(zhuǎn)string的實現(xiàn)
本文主要介紹了Python中byte字符串轉(zhuǎn)string的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2023-07-07pandas 如何保存數(shù)據(jù)到excel,csv
這篇文章主要介紹了pandas 如何保存數(shù)據(jù)到excel,csv的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07基于python+selenium自動健康打卡的實現(xiàn)代碼
這篇文章主要介紹了基于python+selenium自動健康打卡,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2021-01-01