Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python 저수준 스레딩 API

<시간/>

Python 라이브러리의 '_thread' 모듈은 전역 데이터 공간을 공유하는 여러 스레드가 있는 경량 프로세스 작업을 위한 저수준 인터페이스를 제공합니다. 동기화를 위해 이 모듈에는 간단한 잠금(뮤텍스 또는 바이너리 세마포라고도 함)이 정의되어 있습니다. '스레딩' 내장 모듈은 이 모듈 위에 구축된 상위 수준 스레딩 API를 제공합니다.

start_new_thread()

이 모듈 수준 함수는 현재 프로세스에서 새 스레드를 여는 데 사용됩니다. 함수는 함수 객체를 인수로 취합니다. 이 함수는 새 스레드가 성공적으로 생성되면 호출됩니다. 이 함수의 범위는 스레드의 수명에 해당합니다. sleep() 함수를 호출하여 스레드가 차단될 수 있습니다.

다음 코드는 _thread 모듈을 사용하는 스레드 메커니즘의 간단한 예입니다.

import _thread
import time

def run( threadName):
   count = 0
   for i in range(1,6):
      time.sleep(5)
      print ( threadName, i )

_thread.start_new_thread( run, ("child", ) )

for i in range(1,6):
   print ( 'main', i )
   time.sleep(5)

start_new_thread() 함수는 run 함수를 병렬로 호출하는 새 스레드를 생성합니다. run() 함수와 프로그램의 메인 스레드에 루프가 있습니다. 두 가지 모두에서 sleep() 함수를 호출하면 아래와 같이 중복 실행됩니다. -

main 1
child 1
main 2
child 2
main 3
child 3
main 4
child 4
main 5
child 5

스레드 간 동기화는 Lock 개체를 사용하여 수행됩니다. assign_lock() 함수는 잠금 개체를 반환합니다. 다음 방법을 사용할 수 있습니다.

획득()

이 메서드는 다른 스레드에서 해제될 때까지 무조건 잠금을 획득합니다. 한 번에 하나의 스레드만 잠금을 획득할 수 있습니다. 잠금이 성공적으로 획득되면 반환 값은 True이고 그렇지 않으면 False입니다.

릴리스()

이 메서드는 잠금을 해제합니다. 잠금은 이전에 획득해야 하지만 반드시 동일한 스레드에서 획득할 필요는 없습니다.

다음 예에서는 두 개의 스레드가 선언됩니다. 각각은 run() 함수를 동시에 호출합니다. 그 중 하나는 잠금을 획득하고 다른 하나는 대기하는 동안 '동기화' 기능으로 진입합니다.

import _thread
import time

def run( threadName):
   lock.acquire()
   synchronized(threadName)
   lock.release()

def synchronized(threadName):
   print (threadName,"has acquired lock")
   counter = 10
   while counter:
      time.sleep(1)
      print ('*', end='')
      counter = counter-1
      print('\n{} has released lock'.format( threadName))

lock = _thread.allocate_lock()

_thread.start_new_thread( run, ("t1", ) )
_thread.start_new_thread( run, ("t2", ) )

출력

>>> t1 has acquired lock
**********
t1 has released lock
t2 has acquired lock
**********
t2 has released lock