1. 소개
스레드와 프로세스 중에서는 프로세스가 더 안정적이고 프로세스가 여러 머신에 배포될 수 있는 반면 스레드는 최대 동일한 머신의 여러 CPU에만 배포될 수 있으므로 선호되어야 합니다. .
Python의 다중 처리 모듈은 여러 프로세스를 지원할 뿐만 아니라 관리자 하위 모듈도 여러 프로세스를 여러 컴퓨터에 배포하는 것을 지원합니다. 서비스 프로세스를 스케줄러로 작성하여 작업을 여러 다른 프로세스에 배포하고 관리를 위해 네트워크 통신에 의존할 수 있습니다.
2. 사례 분석
크롤러 프로그램을 만들 때 웹 사이트의 모든 사진을 가져옵니다. 여러 프로세스를 사용하는 경우 일반적으로 하나의 프로세스가 사진의 링크 주소를 가져오고 링크 주소를 넣는 역할을 합니다. in 대기열에서는 다른 프로세스가 대기열에서 링크 주소를 가져와 로컬로 다운로드하고 저장하는 역할을 담당합니다.
분산 프로세스를 사용하여 어떻게 구현하나요?
한 컴퓨터의 프로세스는 링크 주소를 가져오는 역할을 담당하고 다른 컴퓨터의 프로세스는 이를 저장하는 역할을 합니다. 직면한 주요 문제는 다른 시스템 프로세스가 액세스할 수 있도록 대기열을 네트워크에 노출시키는 것입니다. 이 프로세스는 로컬 대기열의 네트워킹이라고 할 수 있습니다.
예:
1.py
from multiprocessing.managers import BaseManager from multiprocessing import freeze_support, Queue # 任务个数 task_number = 10 # 收发队列 task_quue = Queue(task_number) result_queue = Queue(task_number) def get_task(): return task_quue def get_result(): return result_queue # 创建类似的queueManager class QueueManager(BaseManager): pass def win_run(): # 注册在网络上,callable 关联了Queue 对象 # 将Queue对象在网络中暴露 # window下绑定调用接口不能直接使用lambda,所以只能先定义函数再绑定 QueueManager.register('get_task_queue', callable=get_task) QueueManager.register('get_result_queue', callable=get_result) # 绑定端口和设置验证口令 manager = QueueManager(address=('127.0.0.1', 8001), authkey='qiye'.encode()) # 启动管理,监听信息通道 manager.start() try: # 通过网络获取任务队列和结果队列 task = manager.get_task_queue() result = manager.get_result_queue() # 添加任务 for url in ["ImageUrl_" + str(i) for i in range(10)]: print('url is %s' % url) task.put(url) print('try get result') for i in range(10): print('result is %s' % result.get(timeout=10)) except: print('Manager error') finally: manager.shutdown() if __name__ == '__main__': freeze_support() win_run()
서버에 연결하면 포트 및 확인 비밀번호는 서버 프로세스의 것과 정확히 동일하게 유지되어야 합니다. 네트워크에서 대기열 가져오기, 현지화 수행, 작업 가져오기. 작업 큐에서 결과를 결과에 씁니다. Queue
2.py
#coding:utf-8 import time from multiprocessing.managers import BaseManager # 创建类似的Manager: class Manager(BaseManager): pass #使用QueueManager注册获取Queue的方法名称 Manager.register('get_task_queue') Manager.register('get_result_queue') #连接到服务器: server_addr = '127.0.0.1' print('Connect to server %s...' % server_addr) # 端口和验证口令注意保持与服务进程设置的完全一致: m = Manager(address=(server_addr, 8001), authkey='qiye') # 从网络连接: m.connect() #获取Queue的对象: task = m.get_task_queue() result = m.get_result_queue() #从task队列取任务,并把结果写入result队列: while(not task.empty()): image_url = task.get(True,timeout=5) print('run task download %s...' % image_url) time.sleep(1) result.put('%s--->success'%image_url) #结束: print('worker exit.')
작업 프로세스는 네트워크를 통해 서비스 프로세스에 연결되어야 하므로 서비스 프로세스의 IP를 지정해야 합니다.
실행 결과는 다음과 같습니다.
이미지 주소를 가져와서 해당 주소를 2.py에 전달합니다.
1.py가 전달한 주소를 받아 이미지를 다운로드하면 콘솔에 크롤링 결과가 표시됩니다.
3. 요약
Python의 분산 프로세스 인터페이스는 간단하고 잘 캡슐화되어 있어 여러 시스템에 분산해야 하는 환경에 적합합니다. 대기열의 역할은 작업을 전달하고 결과를 받는 것이라고 설명합니다.
위 내용은 Python의 분산 프로세스 인터페이스를 이해하는 데 도움이 되는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!