前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python分布式进程

Python分布式进程

原创
作者头像
我叫什么好
发布于 2022-01-08 06:27:49
发布于 2022-01-08 06:27:49
49500
代码可运行
举报
文章被收录于专栏:Python1.0Python1.0
运行总次数:0
代码可运行

分布式进程:

分布式进程是指的是将Process进程分布到多台机器上,充分利用多台机器的性能完成复杂的任务。在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。

Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。

举个例子:做爬虫程序时,常常会遇到这样的场景,我们想抓取图片的链接地址,将链接地址存放到Queue中,另外的进程负责从Queue中读取链接地址进行下载和存储到本地。现在把这个过程做成分布式,一台机器上的进程负责抓取链接,其它机器上的进程负责下载存储,那么遇到的主要问题是将Queue暴露到网络中,让其它机器进程都可以访问,分布式进程就是将这一个过程进行了封装,我们可以将这个过程称为本队列的网络化。

创建分布式进程需要一个服务进程与任务进程:

服务进程创建:

建立队列Queue,用来进行进程间的通信。服务进程创建任务队列task_queue,用来作为 传递任务给任务进程的通道;服务进程创建结果队列result_queue,作为任务进程完成任务后回复服务进程的通道。在分布式多进程环境下,必须通过由Queuemanager获得Queue接口来添加任务.

把第一步中建立的队列在网络上注册,暴露给其它进程(主机),注册后获得网络队列,相当于本队队列的映像.

建立一个险象(Queuemanager(BaseManager))实例manager,绑定端口和验证口令。

启动第三步中建立的实例,即启动管理manager,监管信息通道

通过管理实例的方法获得通过网络访问的Queue对象,即再把网络队列实体化成可以使用的本地队列.

创建任务到"本地"队列中,自动上传任务到网络队列中,分配给任务进程进行处理。

注意:我这里是基于window操作系统的,linux系统会有所不同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

# coding:utf-8
# taskManager.py for win

import Queue
from multiprocessing.managers import BaseManage
from multiprocessing import freeze_support

任务个数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
task_num = 10

定义收发队列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
task_queue = Queue.Queue(task_num)
result_queue = Queue.Queue(task_num)


def get_task():
    return task_queue


def get_result():
    return result_queue

创建类似的QueueManage

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class QueueManager(BaseManager):
    pass


def win_run():
    # windows下绑定调用接口不能使用lambda,所以只能先定义函数再绑定
    QueueManager.register('get_task_queue', callable=get_task)
    QueueManager.register('get_result_queue', callable=get_result)
    # 绑定端口并设置验证口令,windows下需要填写IP地址,Linux下不填,默认为本地
    manager = QueueManager(address=('127.0.0.1', 4000), authkey='qty')

启动

manager.start()

通过网络获取任务队列和结果队列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    task = manager.get_task_queue()
    result = manager.get_result_queue()

    try:

        # 添加任务
        for i in range(10):
            print 'put task %s...' % i
            task.put(i)
        print 'try get result...'

        for i in range(10):
            print 'result is %s' % result.get(timeout=10)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    except:
        print 'manage error'
    finally:

一定要关闭,否则会报管理未关闭的错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        manager.shutdown()
        print 'master exit!'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == '__main__':

windows下多进程可能会出现问题,添加这句可以缓解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    freeze_support()
    win_run()

任务进程

使用QueueManager 注册用于获取Queue的方法名称,任务进程只能通过名称来在网络上获取Queue

连接服务器中,端口和验证口令注意保持与服务进程中完全一致

从网络上获取Queue,进行本地化

从Task队列获取任务,并把结果result队列

coding:utf-8

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time
from multiprocessing.managers import BaseManage

创建类似的QueueManager:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class QueueManager(BaseManager):
    pass

第一步:使用QueueManager注册用于获取Queue的方法名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

第二步:连接服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server_addr = '127.0.0.1'
print "Connect to server %s" % server_add

端口和验证口令注意保持与服务进程完全一致

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
m = QueueManager(address=(server_addr, 4000), authkey='qty')

从网络连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
m.connect()

第三步:获取Queue的对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
task = m.get_task_queue()
result = m.get_result_queue()

第四步:从task队列获取任务,并把结果写入result队列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

while not task.empty():
    index = task.get(True, timeout=10)
    print 'run task download %s' % str(index)
    result.put('%s---->success ' % str(index))

处理结束

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print 'worker exit.'

执行结果

先运行:服务进程得到结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

put task 0...
put task 1...
put task 2...
put task 3...
put task 4...
put task 5...
put task 6...
put task 7...
put task 8...
put task 9...
try get result...

再立即运行:任务进程得到结果,防止进程走完后得不到结果,这里一定要立即执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Connect to server 127.0.0.1
run task download 0
run task download 1
run task download 2
run task download 3
run task download 4
run task download 5
run task download 6
run task download 7
run task download 8
run task download 9
worker exit.

最后再回头看服务进程窗口的结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
put task 0...
put task 1...
put task 2...
put task 3...
put task 4...
put task 5...
put task 6...
put task 7...
put task 8...
put task 9...
try get result...
result is 0---->success 
result is 1---->success 
result is 2---->success 
result is 3---->success 
result is 4---->success 
result is 5---->success 
result is 6---->success 
result is 7---->success 
result is 8---->success 
result is 9---->success 
master exit!

这就是一个简单但真正的分布式计算,把代码稍加改造,启动多个worker,就把任务分布到几台甚至几十台机器上,实现大规模的分布式爬虫

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
想用Python爬小姐姐图片?那你得先搞定分布式进程
导读:分布式进程指的是将Process进程分布到多台机器上,充分利用多台机器的性能完成复杂的任务。我们可以将这一点应用到分布式爬虫的开发中。
IT阅读排行榜
2019/06/18
4640
想用Python爬小姐姐图片?那你得先搞定分布式进程
python爬虫 | 一文搞懂分布式进程爬虫
今天咱们来扯一扯分布式进程爬虫,对爬虫有所了解的都知道分布式爬虫这个东东,今天我们来搞懂一下分布式这个概念,从字面上看就是分开来布置,确实如此它是可以分开来运作的。
Python数据科学
2019/06/10
7490
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。
Go进阶者
2021/05/24
3520
一篇文章带你了解Python的分布式进程接口
python网络爬虫(2)回顾Python编程
把内存中的数据变为可保存和共享,实现状态保存。cPickle使用C语言编写,效率高,优先使用。如果不存在则使用pickle。pickle使用dump和dumps实现序列化。
嘘、小点声
2019/07/31
6520
python 性能的优化
NumPy的创始人Travis,创建了CONTINUUM,致力于将Python大数据处理方面的应用。 推出的Numba项目能够将处理NumPy数组的Python函数JIT编译为==机器码执行==,从而上百倍的提高程序的运算速度。
Tim在路上
2020/08/04
1.1K0
Python Windows下分布式进程的坑(分布式进程的一个简单例子)
下面这个例子基于”廖雪峰的Python教程:分布式进程”原例在Linux上运行,直接在Windows上运行会出现错误,下面是针对原例进行的改进,使之能成功运行。 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431929340191970154d52b9d484b88a7b343708fcc60000#0 博主也对代码注释作了更精确的改进。 原例在Wi
Steve Wang
2018/02/05
2.2K0
Python学习笔记(十)·进程和线程
很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。
公爵
2022/09/28
5340
Python学习笔记(十)·进程和线程
Python3.6学习笔记(四)
程序运行中,可能会遇到BUG、用户输入异常数据以及其它环境的异常,这些都需要程序猿进行处理。Python提供了一套内置的异常处理机制,供程序猿使用,同时PDB提供了调试代码的功能,除此之外,程序猿还应该掌握测试的编写,确保程序的运行符合预期。
大江小浪
2018/07/24
7760
python网络爬虫(3)python爬虫遇到的各种问题(python版本、进程等)
Python3中,import cookielib改成 import http.cookiejar
嘘、小点声
2019/07/31
1.3K0
Python学习—pyhton中的进程
进程: 进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据、进程控制块(pcb)三部分组成。 (1)我们编写的程序用来描述进程要完成哪些功能以及如何完成; (2)数据则是程序在执行过程中所需要使用的资源; (3)进程控制块用来记录进程的所有信息。系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
py3study
2020/01/06
5630
7-并发编程
对于CPU计算密集型的任务,python的多线程跟单线程没什么区别,甚至有可能会更慢,但是对于IO密集型的任务,比如http请求这类任务,python的多线程还是有用处。在日常的使用中,经常会结合多线程和队列一起使用,比如,以爬取simpledestops 网站壁纸为例:
py3study
2020/01/02
3450
Python 分布式进程Master
from multiprocessing.managers import BaseManager
py3study
2020/01/15
4640
Python使用Manager对象实现不同机器上的进程跨网络传输数据
本文主要演示不同机器上的进程之间如何通过网络进行数据交换。 (1)首先编写程序文件multiprocessing_server.py,启动服务器进程,创建可共享的队列对象。 from multiprocessing.managers import BaseManager from queue import Queue q = Queue() class QueueManager(BaseManager): pass QueueManager.register('get_queue', callable=l
Python小屋屋主
2018/04/16
1.9K0
python网络爬虫(10)分布式爬虫爬取静态数据
爬虫应该能够快速高效的完成数据爬取和分析任务。使用多个进程协同完成一个任务,提高了数据爬取的效率。
嘘、小点声
2019/07/31
6200
Python多进程并行编程实践:以multiprocessing模块为例
專 欄 ❈Pytlab,Python 中文社区专栏作者。主要从事科学计算与高性能计算领域的应用,主要语言为Python,C,C++。熟悉数值算法(最优化方法,蒙特卡洛算法等)与并行化 算法(MPI,OpenMP等多线程以及多进程并行化)以及python优化方法,经常使用C++给python写扩展。 blog:http://ipytlab.com github:https://github.com/PytLab ❈— 前言 并行计算是使用并行计算机来减少单个计算问题所需要的时间,我们可以通过利用编程语言显
Python中文社区
2018/01/31
2.7K0
Python多进程并行编程实践:以multiprocessing模块为例
Python3 与 C# 并发编程之~ 进程实战篇
之前说过 Queue:在 Process之间使用没问题,用到 Pool,就使用 Manager().xxx, Value和 Array,就不太一样了:
逸鹏
2018/09/07
9480
Python3 与 C# 并发编程之~ 进程实战篇
《Python分布式计算》 第3章 Python的并行计算 (Distributed Computing with Python)多线程多进程多进程队列一些思考总结
我们在前两章提到了线程、进程,还有并发编程。我们在很高的层次,用抽象的名词,讲了如何组织代码,已让其部分并发运行,在多个CPU上或在多台机器上。 本章中,我们会更细致的学习Python是如何使用多个CPU进行并发编程的。具体目标是加速CPU密集型任务,提高I/O密集型任务的反馈性。 好消息是,使用Python的标准库就可以进行并发编程。这不是说不用第三方的库或工具。只是本章中的代码仅仅利用到了Python的标准库。 本章介绍如下内容: 多线程 多进程 多进程队列 多线程 Python从1.4版本开始就支持多
SeanCheney
2018/04/24
1.6K0
《Python分布式计算》 第3章 Python的并行计算 (Distributed Computing with Python)多线程多进程多进程队列一些思考总结
一篇文章搞定Python多进程(全)
前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下:
南山烟雨
2019/05/05
6450
一篇文章搞定Python多进程(全)
Python 多进程
上面的代码开启了5个子进程去执行函数,我们可以观察结果,是同时打印的,这里实现了真正的并行操作,就是多个CPU同时执行任务。我们知道进程是python中最小的资源分配单元,也就是进程中间的数据,内存是不共享的,每启动一个进程,都要独立分配资源和拷贝访问的数据,所以进程的启动和销毁的代价是比较大了,所以在实际中使用多进程,要根据服务器的配置来设定。
为为为什么
2022/08/05
3920
一篇文章搞定Python多进程
Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象。这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线程对象中的守护线程方法是setDeamon,而Process进程对象的守护进程是通过设置daemon属性来完成的。
程序员鑫港
2022/01/05
5750
相关推荐
想用Python爬小姐姐图片?那你得先搞定分布式进程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验