Python 다 중 스 레 드 동기 화 를 실현 하 는 네 가지 방식
5944 단어 python다 중 스 레 드 동기 화
자물쇠 메커니즘
threading 의 Lock 클래스 는 이러한 acquire 함수 로 잠 금 을 추가 하고 realase 함수 로 잠 금 을 풀 수 있 습 니 다.
import threading
import time
class Num:
def __init__(self):
self.num = 0
self.lock = threading.Lock()
def add(self):
self.lock.acquire()# ,
self.num += 1
num = self.num
self.lock.release()# ,
return num
n = Num()
class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item
def run(self):
time.sleep(2)
value = n.add()# num 1, +1
print(self.item,value)
for item in range(5):
t = jdThread(item)
t.start()
t.join()#
스 레 드 가 자 물 쇠 를 호출 하 는 acquire()방법 으로 자 물 쇠 를 얻 었 을 때 자 물 쇠 는"locked"상태 로 들 어 갑 니 다.매번 한 라인 만 자 물 쇠 를 얻 을 수 있다.이 때 다른 스 레 드 가 이 자 물 쇠 를 가 져 오 려 고 하면 이 스 레 드 는'blocked'상태 로 바 뀌 어'동기 화 차단'이 라 고 합 니 다.(다 중 스 레 드 의 기본 개념 참조)자 물 쇠 를 가 진 스 레 드 가 자 물 쇠 를 호출 하 는 release()방법 으로 자 물 쇠 를 풀 때 까지 자 물 쇠 는'unlocked'상태 로 들 어 갑 니 다.스 레 드 스케줄 러 는 동기 화 차단 상태 에 있 는 스 레 드 에서 하 나 를 선택 하여 자 물 쇠 를 얻 고 이 스 레 드 를 실행(running)상태 로 들 어가 게 합 니 다.
신호 량
신 호 량 도 acquire 방법 과 release 방법 을 제공 합 니 다.acquire 방법 을 호출 할 때마다 내부 카운터 가 0 보다 크 면 1 을 줄 이 고 내부 카운터 가 0 이면 이 스 레 드 를 막 습 니 다.스 레 드 가 release 방법 을 호출 하여 내부 계수 기 를 1 이상 으로 업데이트 하 는 것 을 알 고 있 습 니 다.
import threading
import time
class Num:
def __init__(self):
self.num = 0
self.sem = threading.Semaphore(value = 3)
#
def add(self):
self.sem.acquire()# 1
self.num += 1
num = self.num
self.sem.release()# 1
return num
n = Num()
class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item
def run(self):
time.sleep(2)
value = n.add()
print(self.item,value)
for item in range(100):
t = jdThread(item)
t.start()
t.join()
조건 부 판단이른바 조건 변수,즉 이런 메커니즘 은 특정한 조건 을 만족 시 킨 후에 야 라인 이 관련 데 이 터 를 방문 할 수 있다.
Condition 류 를 사용 하여 완성 합 니 다.잠 금 장치 처럼 사용 할 수 있 기 때문에 acquire 방법 과 release 방법 도 있 습 니 다.그리고 wait,notify,notify All 방법 도 있 습 니 다.
"""
, , +1, -1.
"""
"""
Condition , , acquire release ,
wait, notify, notifyAll 。
"""
import threading
import queue,time,random
class Goods:#
def __init__(self):
self.count = 0
def add(self,num = 1):
self.count += num
def sub(self):
if self.count>=0:
self.count -= 1
def empty(self):
return self.count <= 0
class Producer(threading.Thread):#
def __init__(self,condition,goods,sleeptime = 1):#sleeptime=1
threading.Thread.__init__(self)
self.cond = condition
self.goods = goods
self.sleeptime = sleeptime
def run(self):
cond = self.cond
goods = self.goods
while True:
cond.acquire()#
goods.add()
print(" :",goods.count," ")
cond.notifyAll()# --》
cond.release()#
time.sleep(self.sleeptime)
class Consumer(threading.Thread):#
def __init__(self,condition,goods,sleeptime = 2):#sleeptime=2
threading.Thread.__init__(self)
self.cond = condition
self.goods = goods
self.sleeptime = sleeptime
def run(self):
cond = self.cond
goods = self.goods
while True:
time.sleep(self.sleeptime)
cond.acquire()#
while goods.empty():#
cond.wait()
goods.sub()
print(" :",goods.count," ")
cond.release()#
g = Goods()
c = threading.Condition()
pro = Producer(c,g)
pro.start()
con = Consumer(c,g)
con.start()
동기 화 대기 열put 방법 과 taskdone 방법,quue 는 미 완성 퀘 스 트 수량 num,put 순서 num+1,task 순서 num-1.퀘 스 트 가 모두 완성 되 었 을 때 퀘 스 트 가 끝 납 니 다.
import threading
import queue
import time
import random
'''
1. Queue.Queue() , 。
2. , threading.Thread 。
3. , run 。
4. , queue.task_done() 。
5. join , , 。
'''
class jdThread(threading.Thread):
def __init__(self,index,queue):
threading.Thread.__init__(self)
self.index = index
self.queue = queue
def run(self):
while True:
time.sleep(1)
item = self.queue.get()
if item is None:
break
print(" :",self.index," ",item," ")
self.queue.task_done()#task_done -1
q = queue.Queue(0)
'''
,
0 , .
'''
for i in range(2):
jdThread(i,q).start()#
for i in range(10):
q.put(i)#put +1
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.