国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

香港云服务器
服務器之家 - 腳本之家 - Python - Python多線程同步Lock、RLock、Semaphore、Event實例

Python多線程同步Lock、RLock、Semaphore、Event實例

2020-05-14 09:38腳本之家 Python

這篇文章主要介紹了Python多線程同步Lock、RLock、Semaphore、Event實例,Lock & RLock 用來確保多線程多共享資源的訪問,Semaphore用來確保一定資源多線程訪問時的上限,Event是最簡單的線程間通信的方式,需要的朋友可以參考下

一、多線程同步

由于CPython的python解釋器在單線程模式下執行,所以導致python的多線程在很多的時候并不能很好地發揮多核cpu的資源。大部分情況都推薦使用多進程。

python的多線程的同步與其他語言基本相同,主要包含:

Lock & RLock :用來確保多線程多共享資源的訪問。
Semaphore : 用來確保一定資源多線程訪問時的上限,例如資源池。 
Event : 是最簡單的線程間通信的方式,一個線程可以發送信號,其他的線程接收到信號后執行操作。 

二、實例

1)Lock & RLock

Lock對象的狀態可以為locked和unlocked

使用acquire()設置為locked狀態;
使用release()設置為unlocked狀態。

如果當前的狀態為unlocked,則acquire()會將狀態改為locked然后立即返回。當狀態為locked的時候,acquire()將被阻塞直到另一個線程中調用release()來將狀態改為unlocked,然后acquire()才可以再次將狀態置為locked。

Lock.acquire(blocking=True, timeout=-1),blocking參數表示是否阻塞當前線程等待,timeout表示阻塞時的等待時間 。如果成功地獲得lock,則acquire()函數返回True,否則返回False,timeout超時時如果還沒有獲得lock仍然返回False。

實例:(確保只有一個線程可以訪問共享資源)

復制代碼 代碼如下:

import threading
import time
 
num = 0
lock = threading.Lock()
 
def func(st):
    global num
    print (threading.currentThread().getName() + ' try to acquire the lock')
    if lock.acquire():
        print (threading.currentThread().getName() + ' acquire the lock.' )
        print (threading.currentThread().getName() +" :%s" % str(num) )
        num += 1
        time.sleep(st)
        print (threading.currentThread().getName() + ' release the lock.'  )       
        lock.release()
 
t1 = threading.Thread(target=func, args=(8,))
t2 = threading.Thread(target=func, args=(4,))
t3 = threading.Thread(target=func, args=(2,))
t1.start()
t2.start()
t3.start()

 

結果:

Python多線程同步Lock、RLock、Semaphore、Event實例

RLock與Lock的區別是:RLock中除了狀態locked和unlocked外還記錄了當前lock的owner和遞歸層數,使得RLock可以被同一個線程多次acquire()。

2)Semaphore

Semaphore管理一個內置的計數器,
每當調用acquire()時內置計數器-1;
調用release() 時內置計數器+1;
計數器不能小于0;當計數器為0時,acquire()將阻塞線程直到其他線程調用release()。

實例:(同時只有2個線程可以獲得semaphore,即可以限制最大連接數為2):

復制代碼 代碼如下:


import threading
import time

 

semaphore = threading.Semaphore(2)
 
def func():
    if semaphore.acquire():
        for i in range(5):
          print (threading.currentThread().getName() + ' get semaphore')
        semaphore.release()
        print (threading.currentThread().getName() + ' release semaphore')
       
       
for i in range(4):
  t1 = threading.Thread(target=func)
  t1.start()

 

結果:

Python多線程同步Lock、RLock、Semaphore、Event實例

3) Event

Event內部包含了一個標志位,初始的時候為false。
可以使用使用set()來將其設置為true;
或者使用clear()將其從新設置為false;
可以使用is_set()來檢查標志位的狀態;
另一個最重要的函數就是wait(timeout=None),用來阻塞當前線程,直到event的內部標志位被設置為true或者timeout超時。如果內部標志位為true則wait()函數理解返回。

實例: (線程間相互通信)

 

復制代碼 代碼如下:


import logging
import threading
import time

 

logging.basicConfig(level=logging.DEBUG,
format="(%(threadName)-10s : %(message)s",
)

def wait_for_event_timeout(e, t):
    """Wait t seconds and then timeout"""
    while not e.isSet():
      logging.debug("wait_for_event_timeout starting")
      event_is_set = e.wait(t)
      logging.debug("event set: %s" % event_is_set)
    if event_is_set:
      logging.debug("processing event")
    else:
      logging.debug("doing other work")
     
e = threading.Event()
t2 = threading.Thread(name="nonblock",
target=wait_for_event_timeout,args=(e, 2))
t2.start()
logging.debug("Waiting before calling Event.set()")
time.sleep(7)
e.set()
logging.debug("Event is set")

 

運行結果:

Python多線程同步Lock、RLock、Semaphore、Event實例

三、其他

1) 線程局部變量

線程局部變量的值是跟線程相關的,區別與全局的變量。使用非常簡單如下:

復制代碼 代碼如下:

mydata = threading.local()
mydata.x = 1

 

2)對Lock,semaphore,condition等使用with關鍵字代替手動調用acquire()和release()。

延伸 · 閱讀

精彩推薦
480
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久艹在线 | 免费污网址 | 欧美综合一区二区三区 | 美女h视频 | 精品久 | 影音先锋男 | 久久久毛片 | 一级毛片一级毛片一级毛片 | 男人的天堂2018 | 欧美国产日韩在线观看 | 色综合天天天天做夜夜夜夜做 | 久久精品一 | 精品亚洲永久免费精品 | 色av网| 成人aaa视频 | 色狠狠一区二区三区香蕉 | 噜噜噜在线 | 2018自拍偷拍 | 超级黄色毛片 | 91精品国产乱码久久久久久 | 99久久久无码国产精品 | 在线观看亚洲免费视频 | 在线成人av | 亚洲成av人片在线观看 | 国产成人精品久久二区二区 | 男女中文字幕 | 久久久精品久久久久 | 1a级毛片免费观看 | 91免费在线视频 | 精品国产久 | 国产精品九九九 | 成人激情免费视频 | 午夜久久久 | 日本一级淫片免费看 | 九色自拍 | 日韩中文字幕一区 | 麻豆av一区二区 | 国产综合亚洲精品一区二 | 国产在线a | 国产高清免费 | 亚洲精品乱码久久久久久蜜桃麻豆 |