산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

Python - 다중 스레드 프로그래밍

이전 페이지다음 페이지

여러 스레드를 실행하는 것은 여러 다른 프로그램을 동시에 실행하는 것과 유사하지만 다음과 같은 이점이 있습니다. -

스레드에는 시작, 실행 순서 및 결론이 있습니다. 컨텍스트 내에서 현재 실행 중인 위치를 추적하는 명령 포인터가 있습니다.

새 스레드 시작

다른 스레드를 생성하려면 thread에서 사용 가능한 다음 메소드를 호출해야 합니다. 모듈 -

thread.start_new_thread ( function, args[, kwargs] )

이 메서드 호출을 사용하면 Linux와 Windows 모두에서 새 스레드를 빠르고 효율적으로 생성할 수 있습니다.

메서드 호출이 즉시 반환되고 자식 스레드가 시작되고 전달된 args 목록으로 함수를 호출합니다. . 함수가 반환되면 스레드가 종료됩니다.

여기, 인수 인수의 튜플입니다. 인수를 전달하지 않고 함수를 호출하려면 빈 튜플을 사용하십시오. 콰르그 키워드 인수의 선택적 사전입니다.

예시

#!/usr/bin/python

import thread
import time

# Define a function for the thread
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )

# Create two threads as follows
try:
   thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print "Error: unable to start thread"

while 1:
   pass

위의 코드가 실행되면 다음 결과가 생성됩니다 -

Thread-1: Thu Jan 22 15:42:17 2009
Thread-1: Thu Jan 22 15:42:19 2009
Thread-2: Thu Jan 22 15:42:19 2009
Thread-1: Thu Jan 22 15:42:21 2009
Thread-2: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:23 2009
Thread-1: Thu Jan 22 15:42:25 2009
Thread-2: Thu Jan 22 15:42:27 2009
Thread-2: Thu Jan 22 15:42:31 2009
Thread-2: Thu Jan 22 15:42:35 2009

저수준 스레딩에는 매우 효과적이지만 스레드 모듈은 최신 스레딩 모듈에 비해 매우 제한적입니다.

스레딩 모듈

Python 2.4에 포함된 최신 스레딩 모듈은 이전 섹션에서 논의한 스레드 모듈보다 훨씬 강력하고 높은 수준의 스레드 지원을 제공합니다.

스레딩 모듈은 스레드의 모든 메소드를 노출합니다. 모듈 및 몇 가지 추가 방법 제공 -

메소드 외에도 스레딩 모듈에는 Thread가 있습니다. 스레딩을 구현하는 클래스. Thread에서 제공하는 메소드 클래스는 다음과 같습니다 -

스레딩을 사용하여 스레드 생성 모듈

스레딩 모듈을 사용하여 새 스레드를 구현하려면 다음을 수행해야 합니다. -

스레드를 생성한 후 하위 클래스의 경우 인스턴스를 만든 다음 start()를 호출하여 새 스레드를 시작할 수 있습니다. , 차례로 run()을 호출합니다. 방법.

예시

#!/usr/bin/python

import threading
import time

exitFlag = 0

class myThread (threading.Thread):
   def __init__(self, threadID, name, counter):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.counter = counter
   def run(self):
      print "Starting " + self.name
      print_time(self.name, 5, self.counter)
      print "Exiting " + self.name

def print_time(threadName, counter, delay):
   while counter:
      if exitFlag:
         threadName.exit()
      time.sleep(delay)
      print "%s: %s" % (threadName, time.ctime(time.time()))
      counter -= 1

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

print "Exiting Main Thread"

위의 코드가 실행되면 다음 결과가 생성됩니다 -

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Thu Mar 21 09:10:03 2013
Thread-1: Thu Mar 21 09:10:04 2013
Thread-2: Thu Mar 21 09:10:04 2013
Thread-1: Thu Mar 21 09:10:05 2013
Thread-1: Thu Mar 21 09:10:06 2013
Thread-2: Thu Mar 21 09:10:06 2013
Thread-1: Thu Mar 21 09:10:07 2013
Exiting Thread-1
Thread-2: Thu Mar 21 09:10:08 2013
Thread-2: Thu Mar 21 09:10:10 2013
Thread-2: Thu Mar 21 09:10:12 2013
Exiting Thread-2

스레드 동기화

Python과 함께 제공되는 스레딩 모듈에는 스레드를 동기화할 수 있는 구현하기 쉬운 잠금 메커니즘이 포함되어 있습니다. Lock()을 호출하여 새 잠금이 생성됩니다. 새 잠금을 반환하는 메서드입니다.

획득(차단) 새 잠금 개체의 메서드는 스레드가 동기적으로 실행되도록 하는 데 사용됩니다. 선택적 차단 매개변수를 사용하면 스레드가 잠금을 획득하기 위해 대기하는지 여부를 제어할 수 있습니다.

차단하는 경우 0으로 설정되면 스레드는 잠금을 획득할 수 없는 경우 0 값으로 즉시 리턴하고 잠금을 획득한 경우 1을 리턴합니다. 블로킹이 1로 설정되면 스레드가 블로킹되고 잠금이 해제될 때까지 기다립니다.

릴리스() 새 잠금 개체의 메서드는 더 이상 필요하지 않을 때 잠금을 해제하는 데 사용됩니다.

예시

#!/usr/bin/python

import threading
import time

class myThread (threading.Thread):
   def __init__(self, threadID, name, counter):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.counter = counter
   def run(self):
      print "Starting " + self.name
      # Get lock to synchronize threads
      threadLock.acquire()
      print_time(self.name, self.counter, 3)
      # Free lock to release next thread
      threadLock.release()

def print_time(threadName, delay, counter):
   while counter:
      time.sleep(delay)
      print "%s: %s" % (threadName, time.ctime(time.time()))
      counter -= 1

threadLock = threading.Lock()
threads = []

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

# Add threads to thread list
threads.append(thread1)
threads.append(thread2)

# Wait for all threads to complete
for t in threads:
    t.join()
print "Exiting Main Thread"

위의 코드가 실행되면 다음 결과가 생성됩니다 -

Starting Thread-1
Starting Thread-2
Thread-1: Thu Mar 21 09:11:28 2013
Thread-1: Thu Mar 21 09:11:29 2013
Thread-1: Thu Mar 21 09:11:30 2013
Thread-2: Thu Mar 21 09:11:32 2013
Thread-2: Thu Mar 21 09:11:34 2013
Thread-2: Thu Mar 21 09:11:36 2013
Exiting Main Thread

다중 스레드 우선 순위 대기열

대기열 모듈을 사용하면 특정 수의 항목을 보유할 수 있는 새 대기열 개체를 만들 수 있습니다. Queue를 제어하는 ​​방법은 다음과 같습니다 -

예시

#!/usr/bin/python

import Queue
import threading
import time

exitFlag = 0

class myThread (threading.Thread):
   def __init__(self, threadID, name, q):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.q = q
   def run(self):
      print "Starting " + self.name
      process_data(self.name, self.q)
      print "Exiting " + self.name

def process_data(threadName, q):
   while not exitFlag:
      queueLock.acquire()
         if not workQueue.empty():
            data = q.get()
            queueLock.release()
            print "%s processing %s" % (threadName, data)
         else:
            queueLock.release()
         time.sleep(1)

threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1

# Create new threads
for tName in threadList:
   thread = myThread(threadID, tName, workQueue)
   thread.start()
   threads.append(thread)
   threadID += 1

# Fill the queue
queueLock.acquire()
for word in nameList:
   workQueue.put(word)
queueLock.release()

# Wait for queue to empty
while not workQueue.empty():
   pass

# Notify threads it's time to exit
exitFlag = 1

# Wait for all threads to complete
for t in threads:
   t.join()
print "Exiting Main Thread"

위의 코드가 실행되면 다음 결과가 생성됩니다 -

Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread

python

  1. 스레드 형성 대 스레드 롤링:차이점은 무엇입니까?
  2. 파이썬 데이터 유형
  3. 파이썬 연산자
  4. 파이썬 통과 문
  5. 파이썬 함수 인수
  6. 파이썬 사전
  7. 파이썬 객체 지향 프로그래밍
  8. 파이썬 - 네트워크 프로그래밍
  9. Python - C를 사용한 확장 프로그래밍
  10. 입문자를 위한 Fanuc G76 스레드 주기