python3執行緒加鎖的乙個例子

2021-09-24 05:43:27 字數 4247 閱讀 1960

再這個例子中,執行緒加上鎖之後有並行變成了實際上的序列

[root@linux1 python_tidb]# cat mypy02.py

#!/usr/bin/env python3

import pymysql,sys,os

import _thread,time

def counter(myid,count):

mutex.acquire()

for i in range(count):

time.sleep(1)

#mutex.acquire()

print("%s=>%s" % (myid,i))

#mutex.release()

mutex.release()

mutex = _thread.allocate_lock()

def parent():

for i in range(5):

myid = 'myid'+str(i)

_thread.start_new_thread(counter,(myid,5,))

parent()

time.sleep(30)

[root@linux1 python_tidb]# ./mypy02.py

myid3=>0

myid3=>1

myid3=>2

myid3=>3

myid3=>4

myid4=>0

myid4=>1

myid4=>2

myid4=>3

myid4=>4

myid2=>0

myid2=>1

myid2=>2

myid2=>3

myid2=>4

myid1=>0

myid1=>1

myid1=>2

myid1=>3

myid1=>4

myid0=>0

myid0=>1

myid0=>2

myid0=>3

myid0=>4

[root@linux1 python_tidb]#

執行緒加鎖的另外乙個例子

[root@linux1 python_tidb]# cat mypy02.py

#!/usr/bin/env python3

import pymysql,sys,os

import _thread,time,random

int1 = 0

def add_int1(myid,count):

#mutex.acquire()

global int1

for i in range(count):

time.sleep(random.random())

if((i % 10)==0):

print("%s=>%s" %(myid,int1))

mutex.acquire()

int1 += 1

mutex.release()

#mutex.release()

mutex = _thread.allocate_lock()

def parent():

for i in range(500):

myid = 'myid'+str(i)

_thread.start_new_thread(add_int1,(myid,100,))

parent()

time.sleep(100)

print("int1:: %s" %(int1))

如果不在函式裡加這句 global int1,則會出現下面的錯誤

unhandled exception in thread started by traceback (most recent call last):

file "./mypy02.py", line 14, in add_int1

int1 += 1

unboundlocalerror: local variable 'int1' referenced before assignment

另外乙個我發現如果不讓執行緒隨機休眠time.sleep(random.random()),則很容易出現大家都在等待鎖,而無法進行下去

我懷疑釋放操作是不是和獲取操作也互斥呢

最開始是 time.sleep(1)所有執行緒都sleep一秒的時候程式根本就進行不下去,誰也獲得不了鎖

併發申請鎖是個問題

同步主線程和其它執行緒的一種實現方法,用鎖

[root@linux1 python_tidb]# cat mypy02.py

#!/usr/bin/env python3

import pymysql,sys,os

import _thread,time,random

int1 = 0

def add_int1(myid,count):

#mutex.acquire()

global int1

for i in range(count):

time.sleep(random.random())

if((i % 10)==0):

print("%s=>%s" %(myid,int1))

mutex.acquire()

int1 += 1

mutex.release()

#mutex.release()

exit_mutexs[myid].release()

mutex = _thread.allocate_lock()

exit_mutexs =[_thread.allocate_lock() for i in range(500)]

for exit_mutex in exit_mutexs:

exit_mutex.acquire()

def parent():

for i in range(500):

#myid = 'myid'+str(i)

_thread.start_new_thread(add_int1,(i,100,))

parent()

for exit_mutex in exit_mutexs:

while exit_mutex.locked():pass

print("int1:: %s" %(int1))

使用列表來同步主線程及其它執行緒

[root@linux1 python_tidb]# cat mypy02.py

#!/usr/bin/env python3

import pymysql,sys,os

import _thread,time,random

int1 = 0

def add_int1(myid,count):

#mutex.acquire()

global int1

for i in range(count):

time.sleep(random.random())

if((i % 10)==0):

print("%s=>%s" %(myid,int1))

mutex.acquire()

int1 += 1

mutex.release()

#mutex.release()

exit_status[myid]=true

mutex = _thread.allocate_lock()

#exit_mutexs =[_thread.allocate_lock() for i in range(500)]

#for exit_mutex in exit_mutexs:

# exit_mutex.acquire()

exit_status = [false] * 500

def parent():

for i in range(500):

#myid = 'myid'+str(i)

_thread.start_new_thread(add_int1,(i,100,))

parent()

#for exit_mutex in exit_mutexs:

# while exit_mutex.locked():pass

while false in exit_status:pass

print("int1:: %s" %(int1))

執行緒池的乙個例子

執行緒池的乙個例子 threadpool.h threadpool.h inte ce for the cthreadpool class.if defined afx threadpool h e4160016 0fd0 4e25 a708 a3240945c9b9 included define...

在乙個執行緒加鎖,另乙個執行緒解鎖

一般來講,乙個執行緒加鎖,另乙個執行緒解鎖,是很容易死鎖的。產生死鎖的四個必要條件 1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。3 不剝奪條件 程序已獲得的資源,在末使用完之前,不能強行剝奪。4 迴圈等待條件 若干程序之間形成...

Python字典應用的乙個例子

python view plain copy usr bin env python 定義乙個空字典 db defnewuser prompt login desired while true name raw input prompt 根據關鍵字name看字典中是否已存在此鍵值對 ifdb.has ...