1. 程式人生 > >Python多執行緒鎖例子

Python多執行緒鎖例子

/mnt/hgfs/Python/day6$ time python thread_clock6.py | grep 'real' (檔名+grep命令)可以看一下執行完一個程式所花的時間

在多執行緒程式執行過程中,為什麼需要給一些執行緒加鎖以及如何加鎖,下面就來說一說。

1.給執行緒加鎖的原因

    我們知道,不同程序之間的記憶體空間資料是不能夠共享的,試想一下,如果可以隨意共享,談何安全?但是一個程序中的多個執行緒是可以共享這個程序的記憶體空間中的資料的,比如多個執行緒可以同時呼叫某一記憶體空間中的某些資料(只是呼叫,沒有做修改)。

    試想一下,在某一程序中,記憶體空間中存有一個變數物件的值為num=8,假如某一時刻有多個執行緒需要同時使用這個物件,出於這些執行緒要實現不同功能的需要,執行緒A需要將num減1後再使用,執行緒B需要將num加1後再使用,而執行緒C則是需要使用num原來的值8。由於這三個執行緒都是共享儲存num值的記憶體空間的,並且這三個執行緒是可以同時併發執行的,當三個執行緒同時對num操作時,因為num只有一個,所以肯定會存在不同的操作順序,想象一下下面這樣操作過程:

1 2 3 4 5 第一步:執行緒A修改了num的值為7 第二步:執行緒C不知道num的值已經發生了改變,直接呼叫了num的值7 第三步:執行緒B對num值加1,此時num值變為8 第四步:執行緒B使用了num值8 第五步:執行緒A使用了num值8

    因為num只有一個,而三個操作都針對一個num進行,所以上面的操作過程是完全有可能的,而原來執行緒A、B、C想要使用的num值應該分別為:7、9、8,這裡卻變成了:8、8、7。試想一下,如果這三個執行緒的操作對整個程式的執行是至關重要的,會造成什麼樣的後果?

    因此出於程式穩定執行的考慮,對於執行緒需要呼叫記憶體中的共享資料時,我們就需要為執行緒加鎖。

2.Python多執行緒鎖

(1)

    先看下面一個未給執行緒加鎖的程式程式碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 import threading import time number = 0 def run(num): global number number += 
1 print number time.sleep(1) for in range(20): t = threading.Thread(target=run, args=(i,)) t.start()

    程式執行結果如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

相關推薦

Python執行例子

/mnt/hgfs/Python/day6$ time python thread_clock6.py | grep 'real' (檔名+grep命令)可以看一下執行完一個程式所花的時間 在多執行緒程式執行過程中,為什麼需要給一些執行緒加鎖以及如何加鎖,下

Python執行例子

Python多執行緒小例子 1、在主執行緒中建立子執行緒 下面的程式碼一共建立了三個執行緒:主執行緒、coding 執行緒和music 執行緒,最後使用thread_list 裝載執行緒

python 執行

python的鎖可以獨立提取出來 1 2 3 4 5 6 7 8 mutex = threading.Lock() #鎖的使用 #建立鎖 mutex = threa

PYTHON——執行:同步:Lock

一、先用一個例子說明沒有用鎖的時候,達到的效果錯誤: 1、例項(沒有鎖的情況): import time import threading # 沒有用鎖的 # 時候,出現多個執行緒拿到相同資源的現象。 # 如下例中,共享資源變數num=100,我們開100個執行緒,每個執行緒將資源變數num減1,按

Python 執行工具包 threading 的超簡單例子

筆者初學 Python,在程式設計中,遇到了多執行緒的問題,即需要一個程式中的幾部分同時執行。 例如:給一個後臺程式寫一個“心跳程序”,定時輸出訊號,以確認程式正常執行。 在網上搜索了下發現有不少帖子,但總感覺帖子中舉的例子不夠簡單和直觀,遂決定寫個自己覺得夠簡單直觀的例子。程式碼如

Python 執行,(全域性變數)資料共享,threading.Lock() 互斥

  demo.py(互斥鎖): import threading import time # 定義一個全域性變數 g_num = 0 def test1(num): global g_num # 全域性變數可以實現執行緒間資料共享。也可以通過傳參實現 fo

Python中的執行程式設計,執行安全與(一) 聊聊Python中的GIL 聊聊Python中的GIL python基礎之執行機制 python--threading執行總結 Python3入門之執行threading常用方法

1. 多執行緒程式設計與執行緒安全相關重要概念 在我的上篇博文 聊聊Python中的GIL 中,我們熟悉了幾個特別重要的概念:GIL,執行緒,程序, 執行緒安全,原子操作。 以下是簡單回顧,詳細介紹請直接看聊聊Python中的GIL  GIL:&n

python執行和GIL全域性直譯器

1、執行緒     執行緒被稱為輕量級程序,是最小執行單元,系統排程的單位。執行緒切換需要的資源一般,效率一般。  2、多執行緒         在單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒 3、

Python執行程式設計,執行

1 2 3 from threading import Thread 4 import time 5 ​ 6 class MyThread(Thread): 7 name1 = 'MyThread-1' 8 def __init__(self,target,args

Python執行程式設計,執行,以及補充上一篇程序文章

程序補充 程序間的訊號 訊號是唯一的非同步通訊方法 一個程序向另一個程序傳送一個訊號來傳遞某種資訊,接受者根據傳遞的資訊來做相應的事 $ kill -l檢視系統訊號說明 $ kill -9 pid號對程序傳送訊號 訊號名稱 說明

python------執行

一、類式呼叫 from multiprocessing import Process import time class MyProcess(Process): def __init__(self): super(MyProcess,

Python執行讀寫檔案加

Python的多執行緒在io方面比單執行緒還是有優勢,但是在多執行緒開發時,少不了對檔案的讀寫操作。在管理多個執行緒對同一檔案的讀寫操作時,就少不了檔案鎖了。 使用fcntl 在linux下,python的標準庫有現成的檔案鎖,來自於fcntl模組。這個模組提供了unix

python執行及互斥使用

def RunThread(target, *args): #傳入一個函式多執行緒執行 print u"啟動執行緒:", target.__name__ t = threading.Thread(target = target, args = args) #t.set

Python 執行

多執行緒類似於同時執行多個不同程式,多執行緒執行有如下優點: (1)使用執行緒可以把佔據長時間的程式中的任務放到後臺去處理。 (2)使用者介面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度 (3)程式的執行

Python 執行 程序 全域性直譯器GIL join

Python 程式碼的執行由Python 虛擬機器(也叫直譯器主迴圈)來控制。Python 在設計之初就考慮到要在主迴圈中,同時只有一個執行緒在執行,就像單CPU 的系統中執行多個程序那樣,記憶體中可以存放多個程式,但任意時刻,只有一個程式在CPU 中執行。同樣地,雖然Py

python程序執行執行

程序: 程序就是一段程式的執行過程。 執行緒: 通常在一個程序中可以包含若干個執行緒,當然一個程序中至少有一個執行緒,不然沒有存在的意義。執行緒可以利用程序所擁有的資源,在引入執行緒的作業系統中,通常都是把程序作為分配資源的基本單位,而把執行緒作為獨立執行

Python執行中阻塞(join)與(Lock)的使用誤區

關於阻塞主執行緒 join的錯誤用法 Thread.join() 作用為阻塞主執行緒,即在子執行緒未返回的時候,主執行緒等待其返回然後再繼續執行. join不能與start在迴圈裡連用 以下為錯誤程式碼,程式碼建立了5個執行緒,然後用一個迴圈啟用執行緒,

python 執行程式設計(一個經典例子

python 多執行緒經典案例(摘自《python核心程式設計》) 使用佇列的資料結構,生產者生產商品,消費者選取商品,且時間均不固定 from random import randint from time import sleep from queu

python執行程式設計(4): 死和可重入

線上程間共享多個資源的時候,如果兩個執行緒分別佔有一部分資源並且同時等待對方的資源,就會造成死鎖。儘管死鎖很少發生,但一旦發生就會造成應用的停止響應。下面看一個死鎖的例子: # encoding: UTF-8import threadingimport timec

python執行程式設計(3): 使用互斥同步執行

問題的提出 上一節的例子中,每個執行緒互相獨立,相互之間沒有任何關係。現在假設這樣一個例子:有一個全域性的計數num,每個執行緒獲取這個全域性的計數,根據num進行一些處理,然後將num加1。很容易寫出這樣的程式碼: # encoding: UTF-8import