파이썬 | 큐 큐

서문

코호트 연구로 간주이 문서 노트, 큐 모듈은 검색 할 수있는 큐의 요소의 순서 만 다른, 큐의 세 가지 유형을 구현합니다. 에서 FIFO큐 작업이 검색 할 추가 할 수 있습니다. 에서 LIFO큐의 첫 번째 요소는 최근 (스택 유사한 동작) 검색된 부가된다. 우선 순위 큐는 요소들이 반환되는 첫 번째 항목의 최소값 (heapq 모듈을 사용) 정렬 상태를 유지한다.

이 호출 큐의 파이썬 2.X 버전은 참조를 필요로 주목할 만하다 import Queue당신은 파이썬 3.X 버전 필요import queue

두 큐 기능

일반적으로 사용되는 기능 2.1 큐

일반적으로 사용되는 방법을 대기열 :

qsize() 获取队列的元素个数。
put(item [,block[, timeout]]): 往queue中放一个item
get(item [,block[, timeout]]): 从queue中取出一个item,并在队列中删除的这个item

특히 주목할 있습니다 :

블록이 True이면 시간 제한 없음 (없습니다 또한 기본 옵션 ) 큐가 사용 가능한 데이터 / 위치에 나타날 때까지 다음 수 () / 넣어 () 차단할 수 있습니다. 타임 아웃이 양의 정수이면, 기능은 제한이 N 초까지 다음 예외를 발생 차단한다.

호출 블록이 거짓 넣을 경우, 데이터 큐 경우, 가져 오기를 (전화) 또는 공석 여부 (), 즉시 (시간 초과가 무시) 예외를 throw합니다.

task_done(): 表示前面排队的任务已经被完成。被队列的消费者线程使用。每个 get() 被用于获取一个任务, 后续调用 task_done() 告诉队列,该任务的处理已经完成。
join(): 队列中所有的元素都被接收和处理完毕之前程序一直阻塞。

메인 프로그램을 호출하는 경우 애플리케이션에서, 현재 프로그램의 차단은 대기열의 모든 요소가 처리 된 경우, 큐에 각각 넣어 () 엔트리가 있음을 의미한다 (블록화 발생) (조인 task_done()받은 ). 경우 task_done()수가 더 큐에있는 항목의 수 이상이라고하는 ValueError 예외를 일으킨다.

우리는 프로그램에 의해 큐에 요소를 추가 할 때, 미완성 작업의 수는 증가 할 것이다. 소비자 스레드 통화를 할 때마다 task_done()이 요소가 회복되었을 때 표현, 비즈니스 로직에 관련된 요소가 완료되고, 완료되지 않은 횟수가 감소됩니다. 카운트가 완료되지 않은 제로로 떨어질 때, 프로그램은 () 차단에 가입 잠금을 해제합니다.

2.2 연습

우리는 대기열에 빵을 생산하는 생산자와 소비자 모델 생산자의 더 고전적인 사례를 사용, 소비자 내부의 큐는 빵을 얻을 수 있습니다.

# encoding: utf-8
"""
author: [email protected]
time: 2019/8/14 11:20 PM
func:
"""

from multiprocessing import Process, JoinableQueue, Lock
import time
import random

thread_lock = Lock()


def lock_print(msg):
    with thread_lock:
        print (msg)


def consumer(q):
    while True:
        res = q.get(block=True, timeout=3) # 如果为空 则等待3秒超时则报错退出
        print('消费者拿到了 %s' % res)
        q.task_done()


def producer(q):
    for item in range(4):
        time.sleep(random.randrange(1, 2))
        q.put('馒头{0}'.format(item))
        print('生产者做好了 %s' %'馒头{0}'.format(item))
    q.join()
    lock_print("生产结束")


if __name__ == '__main__':
    print('主进程开始')
    q = JoinableQueue()
    pd = Process(target=producer, args=(q,))
    cp = Process(target=consumer, args=(q,))
    cp.daemon = True ## 
    pd.start()
    cp.start()
    pd.join()
    print('主进程结束')

설명
생산자에 의해 여기 빵과 만두를 생산하는 put()소비자의 사용으로, 글로벌 큐에 get()빵 큐를 획득 한 후 전화 task_done()알림 큐 빵 소비자를 인수하고있다.

세트 cp.daemon = True소비자 프로세스가 기본 프로세스 종료와 함께 종료됩니다 나타냅니다. 쓸 수있는 방법이있다

if __name__ == '__main__':
    print('主进程开始')
    q = JoinableQueue()
    pd = Process(target=producer, args=(q,))
    cp = Process(target=consumer, args=(q,))
    pd.start()
    cp.start()
    pd.join()
    cp.join() 
    print('主进程结束')

cp.join()생산자 과정을 기다리는 소비자는 타임 아웃 데이터 세트까지 대기열에 넣어왔다. 특정 논리는 생산자가 데이터를 생성하거나 주 과정의 마지막 종료와 함께하기를 기다려야 할 필요가 자체 절차를 설정하기 위해 실제 요구의 조합을 필요로한다.

III는 요약

본 논문에서는 다중 데몬 프로세스는 큐를 두 가지 기능을 사용하는 방법을 학습, () 메소드를 이전 문서에서 설명하고 참여 task_donejoin. 사용의 함수에서 볼 수 학습, 손 - 관심 친구에 대한 깊이있는 탐구를 필요로 더 그러나 다른있다.

추천 도서

https://docs.python.org/zh-cn/3/library/queue.html
https://python-parallel-programmning-cookbook.readthedocs.io/zh_CN/latest/chapter2/12_Thread_communication_using_a_queue.html

-THE 장래가

경우, 운영 및 데이터베이스 기술의 지식 공유, 개인의 성장과 자기 관리, 그리고 다른 주제의 유지 보수 문제를 해결하는 대중 번호 데이터베이스 기술 및 성능 최적화에이 장기 초점을 우려 코드를 스캔에 오신 것을 환영합니다.

추천

출처www.cnblogs.com/yangyi402/p/11413674.html