python 系統 執行緒

2022-02-01 19:19:27 字數 2812 閱讀 7045

執行緒之間,全域性變數可以共享,但是區域性變數依然是不共享的,執行緒的建立方式: threading.thread(),還可以定義乙個類繼承thread,重寫他的run方法,具體和程序的寫法一樣.

那麼,執行緒之前全域性變數共享,如果兩個執行緒同時修改乙個全域性變數,就會有一些麻煩,所以需要用到互斥鎖:

from

threading import thread, lock

import time

g_num = 0

def test1():

global

g_num

mutex.acquire()

for i in range(1000000

): g_num += 1

mutex.release()

print(g_num)

def test2():

global

g_num

mutex.acquire()

for i in range(1000000

): g_num += 1

mutex.release()

print(g_num)

mutex =lock()

t1 = thread(target=test1)

t1.start()

t2 = thread(target=test2)

t2.start()

>>>185734

11000000

2000000

lock() 是建立一把鎖,用acquire() 的方式加鎖 , release() 的方式解鎖.  如果乙個執行緒對乙個變數加鎖,剩下的執行緒就只能在等待,解鎖之後用通知(還有一種耗費資源的方式是輪詢) 的方式給等待的執行緒傳遞資訊,鎖已經解開.

需要注意應該避免死鎖, lock 的 acquire() 裡面有兩個引數 blocking=true 預設是true 如果已經上鎖,那麼就一直在這等,等到鎖解開為止,也就是堵塞. 改成false 的話如果已上鎖那麼就跳過這個加鎖操作,所以一般搭配 if 使用 加鎖成功返回值true. 還有乙個引數timeout=-1 ,預設-1.就是延遲,如果改成正數,那麼就會在等待多少秒之後才放棄加鎖.

同步 : 協同步調,按預定的先後次序執行. 非同步:不確定什麼時候執行.

threading.local() 建立乙個物件,裡面可以儲存一些類似字典一樣的引數,如 localval = threading.local()

localval.val = name這條語句可以儲存乙個變數到當前執行緒,如果在另外乙個執行緒裡面再次對localval.val進行賦值,

那麼會在另外乙個執行緒單獨建立記憶體空間來儲存,也就是說在不同的執行緒裡面賦值 不會覆蓋之前的值,因為每個

執行緒裡面都有乙個單獨的空間來儲存這個資料,而且這個資料是隔離的,其他執行緒無法訪問,就像這張圖一樣:

最後,生產者與消費者模型:

from

queue import queue

import time, threading

class

producer(threading.thread):

def run(self):

global

queue

count = 0

while

true:

if queue.qsize() < 1000

:

for i in range(100

): count = count + 1

msg = '

生成產品

' +str(count)

queue.put(msg)

print(msg)

time.sleep(

0.5)

class

consumer(threading.thread):

def run(self):

global

queue

while

true:

if queue.qsize() > 100

:

for i in range(3

): msg = self.name + '

消費了' + queue.get

() print(msg)

time.sleep(

0.5)

if __name__ == '

__main__':

queue =queue()

for i in range(500

): queue.put(

'初始產品

' +str(i))

for i in range(2

): p =producer()

p.start()

for i in range(5

): c =consumer()

c.start()

from queue import queue (python2 是 from queue) 這是佇列,先進先出,用來緩衝資料, 有 get put qsize 等方法,和程序的那個程序間通訊的佇列(from multiprocessing import queue) 基本一樣.

思路理解即可.

python 系統 執行緒池

參考文件 使用 threadpoolexecutor 類,as completed 是迭代器,如果有任務執行完成有返回值,則觸發as completed 的迭代.usr bin env python coding utf 8 from concurrent.futures import thread...

通過Python指令碼理解系統執行緒

from socket import 匯入socket包中的所有內容 from time import ctime 匯入time包,同時在本地可使用ctime進行呼叫 import thread host localhost port 21567 bufsiz 1024 addr host,port...

通過Python指令碼理解系統執行緒

from socket import 匯入socket包中的所有內容 from time import ctime 匯入time包,同時在本地可使用ctime進行呼叫 import thread host localhost port 21567 bufsiz 1024 addr host,port...