>  기사  >  백엔드 개발  >  Python의 스레드 동기화 기본 요소에 대한 코드 예제

Python의 스레드 동기화 기본 요소에 대한 코드 예제

不言
不言앞으로
2018-11-20 16:06:093042검색

이 기사는 Python의 스레드 동기화 기본 요소에 대한 코드 예제를 제공합니다. 필요한 친구가 참고할 수 있기를 바랍니다.

Threading 모듈은 Python3의 멀티스레딩 모듈입니다. 이 모듈은 Thread, Condition, Event, Lock, Rlock, Semaphore, Timer 등을 포함한 많은 클래스를 통합합니다. 다음 글에서는 Event와 Segmaphore(Boundedsegmaphore)의 사용을 설명하기 위해 주로 사례를 사용합니다.

Event

Event 클래스는 내부적으로 플래그 매개변수를 저장하여 대기를 표시합니다. 이벤트가 있든 없든.

이벤트 클래스 인스턴스 함수

1.set() 플래그를 True로 설정하면 이벤트 차단이 중지됩니다.

2 Clear() 플래그 설정. False로 설정하면 플래그가 삭제되고 이벤트가 다시 차단됩니다

3. wait()는 이벤트를 대기 상태로 설정합니다

4.is_set() 플래그가 차단되는지 확인 Set, 설정되면 True 반환, 그렇지 않으면 False 반환

(1) 단일 이벤트는 다른 이벤트 발생을 기다립니다.

#🎜 🎜#특정 코드: #🎜 🎜#

from time import ctime,sleep
event = Event()

def event_wait():
    print(ctime())
    event.wait()
    print('这是event_wait方法中的时间',ctime())

def event_set(n):
    sleep(n)
    event.set()
    print('这是event_set方法中的时间', ctime())

thread1 = Thread(target=event_wait)
thread2 = Thread(target=event_set,args=(3,))

thread1.start()
thread2.start()

결과:

Sat Nov 17 10:01:05 2018
这是event_wait方法中的时间 Sat Nov 17 10:01:08 2018
这是event_set方法中的时间  Sat Nov 17 10:01:08 2018
# 🎜🎜##🎜 🎜#

(2) 여러 이벤트가 연이어 발생합니다

경주를 예로 들어보겠습니다. 5개의 활주로가 있고 각 활주로는 한 명의 선수(ABCDE)가 있다고 가정합니다.

특정 코드:

from threading import Event
from  threading import Thread
import threading

event = Event()

def do_wait(athlete):
    racetrack = threading.current_thread().getName()
    print('%s准备就绪' % racetrack)
    event.wait()
    print('%s听到枪声,起跑!'%athlete)

thread1 = Thread(target=do_wait,args=("A",))
thread2 = Thread(target=do_wait,args=("B",))
thread3 = Thread(target=do_wait,args=("C",))
thread4 = Thread(target=do_wait,args=("D",))
thread5 = Thread(target=do_wait,args=("E",))

threads = []
threads.append(thread1)
threads.append(thread2)
threads.append(thread3)
threads.append(thread4)
threads.append(thread5)

for th in threads:
    th.start()

event.set()  #这个set()方法很关键,同时对5个线程中的event进行set操作

결과:

Thread-1准备就绪
Thread-2准备就绪
Thread-3准备就绪
Thread-4准备就绪
Thread-5准备就绪
E听到枪声,起跑!
A听到枪声,起跑!
B听到枪声,起跑!
D听到枪声,起跑!
C听到枪声,起跑!

여러 스레드에서 이벤트의 set()이 무작위이고 내부 구현이 inform_all() 메서드에 의한 것임을 알 수 있습니다. 이 방법은 모든 잠긴 이벤트를 한 번에 해제합니다. 먼저 실행 중인 스레드의 시간 조각을 잡는 스레드가 먼저 잠금을 해제합니다.

하나의 set() 함수만 호출하여 모든 이벤트의 종료 차단을 구현할 수 있는 이유는 event.wait()가 스레드 내부에 구현되어 있는 반면, set() 함수는 스레드 내부에 구현되어 있기 때문입니다. 프로세스 호출, Python 다중 스레드는 프로세스 메모리 공간을 공유합니다. 이 두 함수가 서로 다른 프로세스에서 호출되면 이를 달성할 수 없습니다.

BoundedSegmaphore

호스트가 IO 집약적인 작업을 수행한 후 이렇게 많은 작업(멀티스레딩)을 짧은 시간에 수행한다면 time 프로그램을 실행할 때 컴퓨터가 충돌할 가능성이 높습니다. 이때 이 프로그램에 카운터 기능을 추가하여 특정 시점의 스레드 수를 제한할 수 있습니다. IO 작업을 수행할 때마다 세그마포어에 리소스(잠금)를 요청해야 하며, 요청하지 않으면 차단하고 요청이 성공한 경우에만 작업을 실행하는 것과 같습니다.

BoundedSegmaphore와 Segmaphore의 차이점

BoundedSegmaphore에서 요청한 잠금 수는 수신 매개변수로 고정되어 있지만 Segmaphore에서 요청한 잠금 수는 수신 매개변수를 초과할 수 있습니다.

주요 기능:

1.취득() 잠금 요청

2.release() 잠금 해제

자물쇠 수를 고정하는 메커니즘을 설명하기 위해 집을 임대하는 예를 들어 보겠습니다. 작은 아파트에 방이 6개 있고 원래 2명의 거주자가 거주하고 있다고 가정해 보겠습니다.

특정 코드 구현:

from threading import BoundedSemaphore,Lock,Thread
from time import sleep
from random import randrange

lock = Lock()
num = 6
hotel = BoundedSemaphore(num)

def logout():
    lock.acquire()
    print('I want to logout')
    print('A customer logout...')
    try:
        hotel.release()
        print('Welcome again')
    except ValueError:
        print('Sorry,wait a moment.')
    lock.release()

def login():
    lock.acquire()
    print('I want to login')
    print('A customer login...')
    if hotel.acquire(False):
        print('Ok,your room number is...')
    else:
        print('Sorry,our hotel is full')
    lock.release()

#房东
def producer(loops):
    for i in range(loops):
        logout()
        print('还剩%s' % hotel._value, '房间')
        sleep(randrange(2))
#租客
def consumer(loops):
    for i in range(loops):
        login()
        print('还剩%s' % hotel._value, '房间')
        sleep(randrange(2))
def main():
    print('Start')
    room_num = hotel._value
    print('The hotel is full with %s room'%room_num)
    #原本有2个住户
    hotel.acquire()
    hotel.acquire()
    thread1 = Thread(target=producer,args=(randrange(2,8),))
    thread2 = Thread(target=consumer,args=(randrange(2,8),))
    thread1.start()
    thread2.start()

if __name__ == '__main__':
    main()

결과:

The hotel is full with 6 room
I want to logout
A customer logout...
Welcome again
还剩5 房间
I want to logout
A customer logout...
Welcome again
还剩6 房间
I want to login
A customer login...
Ok,your room number is...
还剩5 房间
I want to login
A customer login...
Ok,your room number is...
还剩4 房间

#🎜 🎜#

_value 값(BoundedSegmaphore 내부의 카운터 카운터)이 들어오는 매개변수 6이어야 하므로 객실 수가 6을 초과하지 않음을 알 수 있습니다.

위 내용은 Python의 스레드 동기화 기본 요소에 대한 코드 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제