백엔드 개발 파이썬 튜토리얼 Python의 대기열 및 다중 프로세스

Python의 대기열 및 다중 프로세스

Feb 25, 2017 am 10:10 AM

최근에 여러 가상 머신에서 작업을 실행해야 하는 프로젝트를 발견했습니다. 다른 사람들의 이전 프로젝트 코드를 참조하고 멀티 프로세스를 사용하여 처리했기 때문에 온라인에서 Python의 멀티 프로세스에 대해 확인했습니다.

1. 먼저 Queue(queue 객체)에 대해 이야기해보겠습니다

Queue는 이전에 공부할 때 직접 Import하고 인용할 수 있는 Python의 표준 라이브러리입니다. , "먼저 먹고, 먼저 잡아라"와 "먼저 먹고, 먼저 토하라"는 유명한 말이 실제로 여기서 언급된 대기열이라고 들었습니다. 대기열을 구성할 때 용량을 정의할 수 있습니다. 과식하지 마세요. 너무 많이 먹으면 , 작성 시 오류가 발생합니다. 숫자는 무한

import Queue

q =을 의미합니다. Queue.Queue(10)

큐에 넣기 Value(put)

q.put('yang')

q.put(4)

q.put(['yan','xing'])

큐에서 값 가져오기 ()

기본 대기열은 선입선출입니다

>>> q.get()
'yang'
>>> ; q.get()
4
>>> q .get()
['yan', 'xing']

큐가 비어 있는 경우 , get을 사용하여 검색하면 차단되므로 일반적으로 대기열을 검색할 때 사용됩니다.

get_nowait() 메서드, 이 메서드는 빈 대기열에서 값을 가져올 때 빈 예외를 발생시킵니다.

따라서 더 일반적인 방법은 먼저 대기열이 비어 있는지 확인하는 것입니다. 비어 있으면 값을 가져옵니다

큐에서 일반적으로 사용되는 방법

Queue.qsize()는 대기열의 크기를 반환합니다
Queue.empty() 대기열이 비어 있으면 True를 반환하고, 그렇지 않으면 False를 반환합니다
Queue.full() 대기열이 가득 차면 True를 반환합니다. , 그렇지 않으면 False
Queue.get([block[, timeout]]) 대기열 가져오기, 시간 초과 대기 시간
Queue.get_nowait () Queue.get(False)과 동일
Non-blocking Queue.put (item) 큐에 쓰기, 타임아웃 대기 시간
Queue.put_nowait(item) Queue.put(item, False)와 동일

2. 다중 처리에서 하위 프로세스 개념 사용

from multiprocessing import Process

Process를 통해 하위 프로세스를 구성할 수 있습니다

p = Process(target =fun,args=(args))

그런 다음 p.start()를 사용하여 하위 프로세스를 시작합니다

그런 다음 p.join() 메서드를 사용하여 상위 프로세스를 실행하기 전에 하위 프로세스의 실행을 완료합니다

from multiprocessing import Process
import os
 
# 子进程要执行的代码
def run_proc(name):
 print 'Run child process %s (%s)...' % (name, os.getpid())
 
if __name__=='__main__':
 print 'Parent process %s.' % os.getpid()
 p = Process(target=run_proc, args=('test',))
 print 'Process will start.'
 p.start()
 p.join()
 print 'Process end.'
로그인 후 복사

Python의 대기열 및 다중 프로세스

3. 필요한 경우 다중 처리에서 pool

을 사용합니다. 하위 프로세스가 여러 개인 경우 고려할 수 있습니다. 프로세스 풀을 사용하여

from multiprocessing import Pool

from multiprocessing import Pool
import os, time
 
def long_time_task(name):
 print 'Run task %s (%s)...' % (name, os.getpid())
 start = time.time()
 time.sleep(3)
 end = time.time()
 print 'Task %s runs %0.2f seconds.' % (name, (end - start))
 
if __name__=='__main__':
 print 'Parent process %s.' % os.getpid()
 p = Pool()
 for i in range(5):
  p.apply_async(long_time_task, args=(i,))
 print 'Waiting for all subprocesses done...'
 p.close()
 p.join()
 print 'All subprocesses done.'
로그인 후 복사

풀을 관리하는 방법은 다음과 같습니다. Process와는 다릅니다.

p.apply_async(func,args=(args))를 통해 구현됩니다. 풀에서 동시에 실행할 수 있는 작업은 컴퓨터의 CPU 수에 따라 다릅니다. 이제 컴퓨터에는 4개의 CPU가 있습니다. 그러면 하위 프로세스 task0, task1, task2 및 task3이 동시에 시작될 수 있습니다. 이전 프로세스가 종료된 후 Task4가 시작됩니다.

Python의 대기열 및 다중 프로세스

위 프로그램을 실행한 후의 결과는 실제로 위 그림의 1, 2, 3에 따라 별도로 수행됩니다. 1이 먼저 인쇄되고, 2가 3초 후에 인쇄되고, 3이 3초 후에 인쇄됩니다.

코드의 p. close()는 프로세스 풀을 닫고 더 이상 프로세스를 추가하지 않습니다. Pool 객체에서 Join() 메서드를 호출하면 모든 하위 프로세스가 실행을 완료할 때까지 기다립니다. 먼저 close()를 호출하고 close()를 호출해야 합니다. 그 후에는 새 프로세스를 계속 추가할 수 없습니다.

그때 인스턴스 풀의 프로세스 수를 정의할 수도 있습니다

위 코드에서 p=Pool(5)이면 모든 하위 프로세스를 동시에 처리할 수 있습니다.

3. 여러 하위 프로세스 간 통신

여러 하위 프로세스 간 통신에는 첫 번째 단계에서 언급한 대기열을 사용해야 합니다. 다음 요구 사항, 하위 프로세스는 큐에 데이터를 쓰고 다른 프로세스는 큐에서 데이터를 가져옵니다.

#coding:gbk

from multiprocessing import Process, Queue
import os, time, random

# 写数据进程执行的代码:
def write(q):
 for value in ['A', 'B', 'C']:
  print 'Put %s to queue...' % value
  q.put(value)
  time.sleep(random.random())

# 读数据进程执行的代码:
def read(q):
 while True:
  if not q.empty():
   value = q.get(True)
   print 'Get %s from queue.' % value
   time.sleep(random.random())
  else:
   break

if __name__=='__main__':
 # 父进程创建Queue,并传给各个子进程:
 q = Queue()
 pw = Process(target=write, args=(q,))
 pr = Process(target=read, args=(q,))
 # 启动子进程pw,写入:
 pw.start() 
 # 等待pw结束:
 pw.join()
 # 启动子进程pr,读取:
 pr.start()
 pr.join()
 # pr进程里是死循环,无法等待其结束,只能强行终止:
 print
 print '所有数据都写入并且读完'
로그인 후 복사


4. 위 내용에 대해 코드에 관한 몇 가지 흥미로운 문제

if __name__=='__main__': 
 # 父进程创建Queue,并传给各个子进程:
 q = Queue()
 p = Pool()
 pw = p.apply_async(write,args=(q,)) 
 pr = p.apply_async(read,args=(q,))
 p.close()
 p.join()
 
 print
 print '所有数据都写入并且读完'
로그인 후 복사

주 함수를 위의 샘플과 같이 작성하면 내가 무엇을 대기열을 가져오는 것이 프로세스 풀의 각 하위 프로세스에 매개변수로 전달되지만

RuntimeError: 대기열 개체는 상속을 통해 프로세스 간에만 공유되어야 합니다

<🎜 오류가 발생합니다. > 확인 결과, 객체는 상위 프로세스와 하위 프로세스 간에 통신할 수 없습니다. 프로세스 풀에서 큐를 사용하려면 다중 프로세스의 Manager 클래스를 사용해야 합니다

if __name__==&#39;__main__&#39;:
 manager = multiprocessing.Manager()
 # 父进程创建Queue,并传给各个子进程:
 q = manager.Queue()
 p = Pool()
 pw = p.apply_async(write,args=(q,))
 time.sleep(0.5)
 pr = p.apply_async(read,args=(q,))
 p.close()
 p.join()
 
 print
 print &#39;所有数据都写入并且读完&#39;
로그인 후 복사

이 대기열을 좋아합니다. 개체는 상위 프로세스와 하위 프로세스 간에 통신할 수 있습니다. 풀을 사용하지 않으면 관리자가 필요하지 않습니다. 나중에 다중 프로세스에서 Manager 클래스를 확장할 수 있습니다

关于锁的应用,在不同程序间如果有同时对同一个队列操作的时候,为了避免错误,可以在某个函数操作队列的时候给它加把锁,这样在同一个时间内则只能有一个子进程对队列进行操作,锁也要在manager对象中的锁

#coding:gbk
 
from multiprocessing import Process,Queue,Pool
import multiprocessing
import os, time, random
 
# 写数据进程执行的代码:
def write(q,lock):
 lock.acquire() #加上锁
 for value in [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]:
  print &#39;Put %s to queue...&#39; % value  
  q.put(value)  
 lock.release() #释放锁 
 
# 读数据进程执行的代码:
def read(q):
 while True:
  if not q.empty():
   value = q.get(False)
   print &#39;Get %s from queue.&#39; % value
   time.sleep(random.random())
  else:
   break
 
if __name__==&#39;__main__&#39;:
 manager = multiprocessing.Manager()
 # 父进程创建Queue,并传给各个子进程:
 q = manager.Queue()
 lock = manager.Lock() #初始化一把锁
 p = Pool()
 pw = p.apply_async(write,args=(q,lock)) 
 pr = p.apply_async(read,args=(q,))
 p.close()
 p.join()
 
 print
 print &#39;所有数据都写入并且读完&#39;
로그인 후 복사

更多Python의 대기열 및 다중 프로세스相关文章请关注PHP中文网!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Mar 05, 2025 am 09:58 AM

이 튜토리얼은 Python을 사용하여 Zipf의 법칙의 통계 개념을 처리하는 방법을 보여주고 법을 처리 할 때 Python의 읽기 및 대형 텍스트 파일을 정렬하는 효율성을 보여줍니다. ZIPF 분포라는 용어가 무엇을 의미하는지 궁금 할 것입니다. 이 용어를 이해하려면 먼저 Zipf의 법칙을 정의해야합니다. 걱정하지 마세요. 지침을 단순화하려고 노력할 것입니다. Zipf의 법칙 Zipf의 법칙은 단순히 : 큰 자연어 코퍼스에서 가장 자주 발생하는 단어는 두 번째 빈번한 단어, 세 번째 빈번한 단어보다 세 번, 네 번째 빈번한 단어 등 4 배나 자주 발생합니다. 예를 살펴 보겠습니다. 미국 영어로 브라운 코퍼스를 보면 가장 빈번한 단어는 "TH입니다.

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? Mar 10, 2025 pm 06:54 PM

이 기사에서는 HTML을 구문 분석하기 위해 파이썬 라이브러리 인 아름다운 수프를 사용하는 방법을 설명합니다. 데이터 추출, 다양한 HTML 구조 및 오류 처리 및 대안 (SEL과 같은 Find (), find_all (), select () 및 get_text ()와 같은 일반적인 방법을 자세히 설명합니다.

파이썬의 이미지 필터링 파이썬의 이미지 필터링 Mar 03, 2025 am 09:44 AM

시끄러운 이미지를 다루는 것은 특히 휴대폰 또는 저해상도 카메라 사진에서 일반적인 문제입니다. 이 튜토리얼은 OpenCV를 사용 하여이 문제를 해결하기 위해 Python의 이미지 필터링 기술을 탐구합니다. 이미지 필터링 : 강력한 도구 이미지 필터

Python을 사용하여 PDF 문서를 사용하는 방법 Python을 사용하여 PDF 문서를 사용하는 방법 Mar 02, 2025 am 09:54 AM

PDF 파일은 운영 체제, 읽기 장치 및 소프트웨어 전체에서 일관된 콘텐츠 및 레이아웃과 함께 크로스 플랫폼 호환성에 인기가 있습니다. 그러나 Python Processing Plain Text 파일과 달리 PDF 파일은 더 복잡한 구조를 가진 이진 파일이며 글꼴, 색상 및 이미지와 같은 요소를 포함합니다. 다행히도 Python의 외부 모듈로 PDF 파일을 처리하는 것은 어렵지 않습니다. 이 기사는 PYPDF2 모듈을 사용하여 PDF 파일을 열고 페이지를 인쇄하고 텍스트를 추출하는 방법을 보여줍니다. PDF 파일의 생성 및 편집에 대해서는 저의 다른 튜토리얼을 참조하십시오. 준비 핵심은 외부 모듈 PYPDF2를 사용하는 데 있습니다. 먼저 PIP를 사용하여 설치하십시오. PIP는 p입니다

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Mar 02, 2025 am 10:10 AM

이 튜토리얼은 Redis 캐싱을 활용하여 특히 Django 프레임 워크 내에서 Python 응용 프로그램의 성능을 향상시키는 방법을 보여줍니다. 우리는 Redis 설치, Django 구성 및 성능 비교를 다루어 Bene을 강조합니다.

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Mar 10, 2025 pm 06:52 PM

이 기사는 딥 러닝을 위해 텐서 플로와 Pytorch를 비교합니다. 데이터 준비, 모델 구축, 교육, 평가 및 배포와 관련된 단계에 대해 자세히 설명합니다. 프레임 워크, 특히 계산 포도와 관련하여 주요 차이점

파이썬의 병렬 및 동시 프로그래밍 소개 파이썬의 병렬 및 동시 프로그래밍 소개 Mar 03, 2025 am 10:32 AM

데이터 과학 및 처리가 가장 좋아하는 Python은 고성능 컴퓨팅을위한 풍부한 생태계를 제공합니다. 그러나 Python의 병렬 프로그래밍은 독특한 과제를 제시합니다. 이 튜토리얼은 이러한 과제를 탐구하며 전 세계 해석에 중점을 둡니다.

파이썬에서 자신의 데이터 구조를 구현하는 방법 파이썬에서 자신의 데이터 구조를 구현하는 방법 Mar 03, 2025 am 09:28 AM

이 튜토리얼은 Python 3에서 사용자 정의 파이프 라인 데이터 구조를 작성하여 클래스 및 작업자 과부하를 활용하여 향상된 기능을 보여줍니다. 파이프 라인의 유연성은 일련의 기능을 데이터 세트, GE에 적용하는 능력에 있습니다.

See all articles