python 中 list 是否是執行緒安全的?

2021-09-12 21:33:04 字數 4083 閱讀 6711

是不是不共享資料就不會發生執行緒不安全?

執行緒安全就是多執行緒訪問時,採取了加鎖的機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問知道該執行緒讀取完,其他的執行緒才可使用,不會出現資料不一致或資料汙染的問題

執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒現後更改資料造成所得到的資料是髒資料。

總的來說,只要執行緒之間沒有共享資源,那麼就是執行緒安全的,有共享資源,為了保證執行緒安全,需要引進鎖的機制。

lis = list(range(10000))

print(lis)

print(len(lis))

from share_var import gloable

import threading

def consume():

for i in gloable.lis:

with open('aab.txt', 'a+') as file:

file.write('{},{}\n'.format(i, threading.current_thread().name))

if __name__ == '__main__':

from threading import thread

t1 = thread(target=consume, name='t1')

t2 = thread(target=consume, name='t2')

t3 = thread(target=consume, name='t3')

t4 = thread(target=consume, name='t4')

t1.start()

t2.start()

t3.start()

t4.start()

t1.join()

t2.join()

t3.join()

t4.join()

from share_var.gloable import lis

import threading

def consume():

for i in lis:

with open('aabc.txt', 'a+') as file:

file.write('{},{}\n'.format(i, threading.current_thread().name))

if __name__ == '__main__':

from threading import thread

t1 = thread(target=consume, name='t1')

t2 = thread(target=consume, name='t2')

t3 = thread(target=consume, name='t3')

t4 = thread(target=consume, name='t4')

t1.start()

t2.start()

t3.start()

t4.start()

t1.join()

t2.join()

t3.join()

t4.join()

以上**的區別就是在引入全域性變數的時候 在引入包 和引入變數的區別

執行的效果呢,

-rw-r--r-- 1 lishulong 197121 355506 mar 18 23:07 aab.txt

-rw-r--r-- 1 lishulong 197121 355537 mar 18 23:07 aabc.txt

發現結構不相同;

環境:$ python -v

python 3.6.2rc1

得出對於共享的全域性 lis 是不安全的在不同的執行緒中??

單執行緒跑  ok。

只要是多執行緒,即使不共享也會出現問題,是gil的問題嗎

dist的話,可不好找,,,,,

這個問題也就這樣吧,,,,

python中改變list中list值的問題

l s 0,0,0 for i in range 3 l 1 1 1 print l 如上 定義乙個空list,新增元素也為list型別。本意是想改變list l中乙個值,使其結果為 0,0,0 0,1,0 0,0,0 但執行的結構下圖所示,將list l中的所有元素都改變了。為找到原因,檢視pyt...

python判斷是否是素數

在python中實現 取出某個數值區間範圍內的所有素數 prime 素數定義為 對於乙個正整數n,如果除了1和它本身,它再不能被任何正整數整除,則它是素數 質數 定義2是最小的素數 import math import time def is prime num return 0 not in nu...

python檢測是否是質數

編寫python指令碼,使得實現以下功能 輸入乙個整數,通過指令碼判斷出輸入的這個數是否是質數,然後輸出是否是質數。指令碼如下圖所示 num input please input a integer i 2 while i num if num i 0 print is not a prime nu...