Python 대기열을 사용하는 방법은 무엇입니까?
파이썬에는 대략 세 가지 대기열 모듈이 사용됩니다.
1. from queue import Queue
이 모듈은 스레드 간 통신에 적합하지만 프로세스 간 통신에는 사용할 수 없습니다.
샘플 코드 1: [참고: 현재 코드에 오류가 있습니다! ! ! 】
import time import threading from queue import Queue def task_func(): global queue while queue.qsize() > 0: x = queue.get() print(f"num: {x}") time.sleep(0.1) def producer_data(): global queue for i in range(100): queue.put(i) time.sleep(0.1) if __name__ == '__main__': queue = Queue() producer_thread = threading.Thread(target=producer_data) producer_thread.start() thread_list = [] for i in range(5): thread = threading.Thread(target=task_func) thread.start() thread_list.append(thread) for thread in thread_list: thread.join() print("主程序执行结束!")
참고: 위는 다음과 같이 작성됩니다.
while queue.qsize() > 0: x = queue.get()
생산자 속도가 소비자 속도만큼 빠르지 않으면 위 소비자 코드가 일찍 종료되어 생산자 속도가 소비할 수 없게 됩니다.
while True: x = queue.get()
이런 방식에도 문제가 있습니다. 이때 소비자 큐는 생산자 큐에 데이터가 있는지 항상 모니터링하므로 스레드가 항상 차단되고 프로그램이 중지되지 않습니다. 이는 시스템 리소스를 심각하게 낭비합니다. apscheduler와 같은 예약된 작업 라이브러리를 사용하는 경우 예약된 작업이 시작되지 않습니다.
실제로 timeout 매개변수는 대기열의 put() 또는 get() 메서드에 제공됩니다. 이 매개변수를 사용하면 위에서 언급한 소비 불가 및 스레드 차단 문제를 효과적으로 해결할 수 있습니다.
샘플 코드 2:
import time import threading from queue import Queue def task_func(): global queue while True: x = queue.get(timeout=10) print(f"num: {x}") def producer_data(): global queue for i in range(100): queue.put(i) time.sleep(0.1) if __name__ == '__main__': queue = Queue() producer_thread = threading.Thread(target=producer_data) producer_thread.start() thread_list = [] for i in range(5): thread = threading.Thread(target=task_func) thread.start() thread_list.append(thread) for thread in thread_list: thread.join() print("主程序执行结束!")
실행 결과:
다양한 상황에 따라 타임아웃 값은 실제 상황에 따라 설정될 수 있습니다. 예약된 작업을 사용하는 경우 시간 제한을 사용해도 괜찮으며 프로그램은 예외 발생을 멈추지 않습니다.
2. from multiprocessing import Queue
이 모듈은 프로세스에 사용되지만 프로세스 풀에는 사용할 수 없습니다.
샘플 코드:
import time from multiprocessing import Process, Queue import queue def producer(queue): queue.put("a") time.sleep(2) def consumer(queue): time.sleep(2) data = queue.get() print(data) if __name__ == "__main__": # queue = queue.Queue() queue = Queue() my_producer = Process(target=producer, args=(queue, )) my_consumer = Process(target=consumer, args=(queue, )) my_producer.start() my_consumer.start() my_producer.join() my_consumer.join() # 使用queue模块的Queue()会报错 # 使用multiprocessing中的Queue(),正确输出a
실행 결과:
3.from multiprocessing import Manager
샘플 코드 :
import time from multiprocessing import Process, Queue, Pool, Manager def producer(queue): queue.put("a") time.sleep(2) def consumer(queue): time.sleep(2) data = queue.get() print(data) if __name__ == "__main__": # queue = Queue() queue = Manager().Queue() pool = Pool() # pool中的进程间通信需要使用Manager pool.apply_async(producer, args=(queue, )) pool.apply_async(consumer, args=(queue, )) pool.close() pool.join()
실행 결과:
위 내용은 Python 대기열을 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Linux 시스템과 함께 제공되는 Python 통역사를 제거하는 문제와 관련하여 많은 Linux 배포판이 설치 될 때 Python 통역사를 사전 설치하고 패키지 관리자를 사용하지 않습니다 ...

Pythonasyncio에 대해 ...

Pylance 유형 감지 문제 솔루션 Python 프로그래밍에서 사용자 정의 데코레이터를 사용할 때 Decorator는 행을 추가하는 데 사용할 수있는 강력한 도구입니다 ...

Python 3.6에 피클 파일 로딩 3.6 환경 오류 : ModulenotFounderRor : nomodulename ...

Linux 터미널에서 Python 사용 ...

파이썬 비동기 라이브러리 사이의 호환성 문제 파이썬에서 비동기 프로그래밍은 동시성과 I/O의 프로세스가되었습니다 ...

아동 프로세스의 문제와 해결책은 신호를 사용하여 부모 프로세스를 죽일 때 계속 실행됩니다. Python 프로그래밍에서 신호를 통해 부모 프로세스를 죽인 후에도 아동 프로세스는 여전히 ...

Python 3.6에 피클 파일로드 3.6 환경 보고서 오류 : modulenotfounderror : nomodulename ...
