Python의 스레드 및 코루틴 요약

零下一度
풀어 주다: 2017-06-16 10:29:11
원래의
1079명이 탐색했습니다.

아래 편집기는 Python의 간단한 스레드와 코루틴에 대한 학습 경험(공유)을 제공합니다. 에디터가 꽤 좋다고 생각해서 지금 공유해서 참고용으로 올려보겠습니다. 에디터를 따라가서 살펴보겠습니다

파이썬에서 스레드에 대한 지원은 사실 충분하지 않습니다. 하지만 파이썬에는 완전한 비동기 네트워크 프레임워크 모듈이 있다고 합니다. 다음에 이에 대한 간단한 요약이 있습니다. Threads in Python

스레딩 라이브러리는 별도의 스레드에서 임의의 Python 호출 가능 개체를 실행하는 데 사용할 수 있습니다. 이 모듈은 스레드 관련 작업에 대한 지원이 충분하지 않지만 여전히 간단한 스레드를 사용하여 I/O 작업을 처리하여 프로그램 응답 시간을 줄일 수 있습니다.

from threading import Thread
import time
 
 
def countdown(n):
  while n > 0:
    print('T-minus:', n)
    n -= 1
 
 
t = Thread(target=countdown, args=(10,))
t.start() # 开启线程
 
time.sleep(2)
 
if t.is_alive() is True:
  print("停止线程...")
  t._stop() # 停止线程
로그인 후 복사

start 함수는 스레드를 시작하는 데 사용되며 _stop 함수는 스레드를 중지하는 데 사용됩니다. 스레드에서 I/O 작업을 수행할 때 차단되는 등의 문제를 방지하려면 일정 시간 동안 실행한 후 스레드가 여전히 존재하는지 확인하면 _stop()을 호출하여 중지할 수 있습니다. 차단을 방지합니다(_stop 함수를 클래스에 캡슐화할 수 있지만 여기서는 그렇게 하지 않았습니다).

물론 스레드를 수동으로 생성하는 대신 ThreadPool 스레드 풀을 호출하여 처리할 수도 있습니다. 스레드 간에 변수를 공유할 필요가 없다면 스레드를 사용하는 것이 매우 편리하므로 번거로운 작업을 많이 줄이고 시간을 절약할 수 있습니다. 스레드 간에 통신해야 하는 경우 대기열을 사용하여 이를 달성할 수 있습니다.

from queue import Queue
from threading import Thread
 
 
class kill:
  def terminate(self, t):
    if t.isAlive is True:
      t._stop()
 
 
def product(out_q):
  for i in range(5):
      out_q.put(i)
 
 
def consumer(in_q):
  for i in range(5):
    print(in_q.get())
 
 
q = Queue()
t1 = Thread(target=consumer, args=(q,))
t2 = Thread(target=product, args=(q,))
t1.start()
t2.start()
 
 
k = kill() # 查询线程是否终止,防止阻塞...
k.terminate(t1)
k.terminate(t2)
로그인 후 복사

큐 인스턴스는 모든 스레드에서 공유되며 필요한 모든 잠금이 있으므로 공유 스레드 수에 관계없이 안전할 수 있습니다. . 멀티 스레드에서 put() 및 get() 메서드 이외의 대기열 클래스 메서드를 사용하지 않도록 주의하십시오. 이는 멀티 스레드 환경에서는 신뢰할 수 없기 때문입니다! 스레드에서 간단하고 소규모의 데이터 통신을 위해 큐를 사용할 수 있습니다. 대용량 데이터에 대화형 통신이 필요한 경우 Python은 사용할 수 있는 관련 모듈을 제공합니다. 특히 Baidu가 필요합니다.

소위 코루틴은 실제로 단일 스레드 환경의 Yield 프로그램입니다.


from collections import deque
 
 
def countdown(n):
  while n > 0:
    print("T-minus", n)
    yield # 返回之后下次直接从这里执行...相当于C#里面得yield return .
    n -= 1
  print("this is countdown!!!")
 
 
def countup(n):
  x = 0
  while x < n:
    print("Counting up", x)
    yield
    x += 1
 
 
class TaskScheduler:
  def init(self):
    self._task_queue = deque()
 
  def new_task(self, task):
    self._task_queue.append(task)
 
  def run(self):
    while self._task_queue:
      task = self._task_queue.popleft()
      try:
        next(task)
        self._task_queue.append(task)
      except StopIteration:
        pass
 
 
sche = TaskScheduler()
sche.new_task(countdown(10))
sche.new_task(countdown(5))
sche.new_task(countup(15))
sche.run()
로그인 후 복사

Python을 사용했던 경험을 이야기해보겠습니다. Python은 정말 좋지만 성능도 비판을 받고 있습니다. Python을 처음 배우기 시작했을 때, 적어도 멋있게 들리는 프로그램도 있었습니다. . Python의 자연어 처리를 사용하여 감정 분석 및 가장 인기 있는 크롤러 프로그램을 수행하고 멋진 데이터 분석 차트를 만드는 것과 같은 높음. 프로그램의 초점이 그것들에 있지 않기 때문에 점차적으로 그것들을 버립니다. 기본 구문을 알고 공식 문서를 이해하는 한 프로그램 코드의 초점은 성능과 최적화에 있습니다. 가능한 한 가장 완전한 기능, 최고의 성능, 가장 아름다운 구조를 갖춘 프로그램을 작성하십시오. 사실 이것은 정치 교사들이 흔히 말하는 '문화 소프트 파워'와 비슷합니다. 프로그램에는 가장 적합한 디자인 패턴을 포함하고, 가장 완벽한 프로그램 최적화를 수행하고, 가장 성능을 절약하는 데이터 구조를 채택하는 등이 있어야 합니다.

위 내용은 Python의 스레드 및 코루틴 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿