91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

threading 之 semaphore信號量

發布時間:2020-06-29 15:02:05 來源:網絡 閱讀:454 作者:windcharger 欄目:編程語言

semaphore信號量的簡單代碼演示

import threading
import logging
import time

FORMAT = '%(threadName)s %(thread)d %(message)s'
logging.basicConfig(format=FORMAT, level=logging.INFO)

def worker(s:threading.Semaphore):
    logging.info('in sub thread')
    logging.info(s.acquire())   # 獲取信號量,計數器 -1
    logging.info('sub thread over')

s = threading.Semaphore(3)   # 創建3個信號量計數器
logging.info(s.acquire())
print(s._value)    # 看看現在信號量的內的數值是多少
logging.info(s.acquire())
print(s._value)
logging.info(s.acquire())
print(s._value)

threading.Thread(target=worker, args=(s, )).start()

time.sleep(2)

logging.info(s.acquire(False))    # 不阻塞,若獲取不到信號量,則為False
logging.info(s.acquire(timeout=10))   # 設置超時時間,等待超時時間過了還未獲取到信號,返回值為False

# 釋放
logging.info('released')
s.release()   # 釋放信號量,計數器i + 1

簡單的資源池演示

import threading
import logging
import random

FORMAT = '%(threadName)s %(thread)d %(message)s'
logging.basicConfig(format=FORMAT, level=logging.INFO)

class Conn:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return self.name

class Pool:
    def __init__(self, count:int):
        self.count = count
        self.pool = [ self._connect('conn-{}'.format(x)) for x in range(self.count)]

    def _connect(self, conn_name):
        return Conn(conn_name)

    def get_conn(self):
        conn = self.pool.pop()
        return conn

    def return_conn(self, conn:Conn):
        self.pool.append(conn)

pool = Pool(3)

def worker(pool:Pool):
    conn = pool.get_conn()
    logging.info(conn)
    threading.Event().wait(random.randint(1,4))
    pool.return_conn(conn)

for i in range(6):
    threading.Thread(target=worker, name='worker-{}'.format(i), args=(pool,)).start()       

使用semaphore來完善代碼

import threading
import logging
import random

FORMAT = '%(threadName)s %(thread)d %(message)s'
logging.basicConfig(format=FORMAT, level=logging.INFO)

class Conn:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return self.name

class Pool:
    def __init__(self, count:int):
        self.count = count
        self.pool = [ self._connect('conn-{}'.format(x)) for x in range(self.count)]
        self.semahore = threading.Semaphore(count)

    def _connect(self, conn_name):
        return Conn(conn_name)

    def get_conn(self):
        self.semahore.acquire()
        conn = self.pool.pop()
        return conn

    def return_conn(self, conn:Conn):
        self.pool.append(conn)
        self.semahore.release()

pool = Pool(3)

def worker(pool:Pool):
    conn = pool.get_conn()
    logging.info(conn)
    threading.Event().wait(random.randint(1,4))
    pool.return_conn(conn)

for i in range(6):
    threading.Thread(target=worker, name='worker-{}'.format(i), args=(pool,)).start()

關于信號量release超出初始值范圍的問題

當我們使用semaphore的時候,如果還未acquire,就release了,會產生什么問題?
會產生是的信號量的值+1,超出了原本設置semaphore的初始值,下面的例子說明了這個問題

import threading
import logging

FORMAT = '%(threadName)s %(thread)d %(message)s'
logging.basicConfig(format=FORMAT, level=logging.INFO)

sema = threading.Semaphore(3)
logging.warning(sema.__dict__)
for _ in range(3):
    sema.acquire()

logging.warning('-----')
logging.warning(sema.__dict__)

for _ in range(4):
    sema.release()
logging.warning(sema.__dict__)

for _ in range(3):
    sema.acquire()
logging.warning('--------')
logging.warning(sema.__dict__)
sema.acquire()
logging.warning('======')
logging.warning(sema.__dict__)

所以這個這樣的問題,可以使用BoundedSemaphore類來實現有界的信號量,若relase超出了初始值的范圍,會拋出ValueError異常

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

霞浦县| 黔西县| 文成县| 房山区| 韶关市| 龙州县| 乐亭县| 彭水| 陈巴尔虎旗| 若尔盖县| 舞阳县| 景东| 望江县| 东宁县| 台湾省| 德庆县| 通州区| 福泉市| 大化| 黄龙县| 天柱县| 彩票| 沁阳市| 陆良县| 固原市| 隆化县| 阳曲县| 宜兴市| 铁岭市| 五大连池市| 即墨市| 胶州市| 塔河县| 平遥县| 彰化县| 松潘县| 民权县| 苏尼特左旗| 冀州市| 白玉县| 宣城市|