>  기사  >  백엔드 개발  >  Python 다중 프로세스 사용 예(코드)

Python 다중 프로세스 사용 예(코드)

不言
不言원래의
2018-09-19 16:41:581831검색

이 문서의 내용은 Python 다중 프로세스의 사용 예제(코드)에 대한 것입니다. 특정 참고 가치가 있으므로 도움이 될 수 있습니다.

Python 멀티스레딩은 IO 집약적인 시나리오에 적합하지만, CPU 집약적인 시나리오에서는 멀티코어 CPU를 완전히 활용할 수 없습니다. 코루틴은 기본적으로 스레드 기반이므로 멀티코어의 장점을 완전히 활용할 수 없습니다.

여러 프로세스를 사용해야 하는 컴퓨팅 집약적 시나리오의 경우 Python의 다중 처리는 스레딩 모듈과 매우 유사하며 프로세스 풀을 사용하여 하위 프로세스의 일괄 생성을 지원합니다.

  • 단일 프로세스 프로세스 만들기(func 사용)

Process 클래스를 인스턴스화하고 함수를 대상 매개변수에 전달하기만 하면 됩니다. 이는 스레딩 모듈과 매우 유사하며 함수의 매개변수입니다.

import os
from multiprocessing import Process

# 子进程要执行的代码
def task(name):
    print('run child process %s (%s)...' % (name, os.getpid()))

if __name__ == '__main__':
    print('parent process %s.' % os.getpid())
    p = Process(target=task, args=('test',))
    p.start()
    p.join()
    print('process end.')

  • 단일 프로세스 프로세스 생성(클래스 사용)

Process 클래스를 상속하고 실행 메서드를 재정의하여 프로세스를 생성하는 것은 기본적으로 스레딩 모듈과 동일합니다

import multiprocessing
import os
from multiprocessing import current_process
class Worker(multiprocessing.Process):
    def run(self):
        name = current_process().name  # 获取当前进程的名称
        print(&#39;run child process <%s>  (%s)&#39; % (name, os.getpid()))

        print(&#39;In %s&#39; % self.name)
        return

if __name__ == &#39;__main__&#39;:
    print(&#39;parent process %s.&#39; % os.getpid())
    p = Worker()
    p.start()
    p.join()
    print(&#39;process end.&#39;)

  * 자식 프로세스를 종료하려면 프로세스를 중지

terminate()하지만 자식 프로세스의 리소스를 해제할 수 없게 되므로 권장되지 않습니다. 자식 스레드의 실행 상태가 명확하지 않기 때문입니다. 부적절한 순간에 하위 스레드가 종료될 가능성이 높습니다.

import multiprocessing
import time

def worker():
    print(&#39;starting worker&#39;)
    time.sleep(0.1)
    print(&#39;finished worker&#39;)

if __name__ == &#39;__main__&#39;:
    p = multiprocessing.Process(target=worker)
    print(&#39;执行前:&#39;, p.is_alive())
    p.start()
    print(&#39;执行中:&#39;, p.is_alive())
    p.terminate()  # 发送停止号
    print(&#39;停止:&#39;, p.is_alive())
    p.join()
    print(&#39;等待完成:&#39;, p.is_alive())

  • 여러 프로세스 프로세스를 직접 생성

import multiprocessing

def worker(num):
    print(f&#39;Worker:%s %s&#39;, num)
    return

if __name__ == &#39;__main__&#39;:
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

  • 프로세스 풀을 사용하여 여러 프로세스를 생성하세요

시스템 관리, 특히 동시 작업을 위해 Python을 사용하는 경우 여러 파일 디렉터리 , 또는 여러 호스트의 원격 제어, 병렬 작업을 통해 많은 시간을 절약할 수 있습니다. 동작할 객체의 개수가 많지 않은 경우 멀티프로세싱에서 Process를 직접 사용하여 여러 개의 프로세스를 동적으로 생성할 수도 있지만, 대상이 수백, 수천 개라면 수동으로 제한하기엔 무리가 있습니다. 프로세스 수가 너무 번거롭다면 이때 프로세스 풀을 사용할 수 있습니다.
풀은 사용자가 호출할 수 있는 지정된 수의 프로세스를 제공할 수 있습니다. 풀에 새 요청이 제출되면 풀이 가득 차지 않은 경우 요청을 실행하기 위해 새 프로세스가 생성됩니다. 풀이 지정된 최대값에 도달하면 요청은 풀의 프로세스가 끝날 때까지 기다린 다음 이를 처리하기 위해 새 프로세스가 생성됩니다.

import os
import random
import time
from multiprocessing import Pool
from time import ctime


def task(name):
    print(&#39;start task %s (%s)...&#39; % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)

    print(&#39;end task %s runs %0.2f seconds.&#39; % (name, (time.time() - start)))


if __name__ == &#39;__main__&#39;:
    print(&#39;parent process %s.&#39; % os.getpid())

    p = Pool()  # 初始化进程池
    for i in range(5):
        p.apply_async(task, args=(i,))  # 追加任务 apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。

    p.close()

    p.join()  # 等待所有结果执行完毕,会等待所有子进程执行完毕,调用join()之前必须先调用close()
    print(f&#39;all done at: {ctime()}&#39;)

각 프로세스의 실행 결과가 중요하다면 get 메소드를 사용하여 결과를 반환할 수 있습니다. 코드는 다음과 같습니다

import os
import random
import time
from multiprocessing import Pool, current_process
from time import ctime


def task(name):
    print(&#39;start task %s (%s)...&#39; % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    print(&#39;end task %s runs %0.2f seconds.&#39; % (name, (time.time() - start)))

    return current_process().name + &#39;done&#39;

if __name__ == &#39;__main__&#39;:
    print(&#39;parent process %s.&#39; % os.getpid())

    result = []

    p = Pool()  # 初始化进程池
    for i in range(5):
        result.append(p.apply_async(task, args=(i,)))  # 追加任务 apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。

    p.close()

    p.join()  # 等待所有结果执行完毕

    for res in result:
        print(res.get())  # get()函数得出每个返回结果的值

    print(f&#39;all done at: {ctime()}&#39;)

 

위 내용은 Python 다중 프로세스 사용 예(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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