Python分布式进程中你会遇到的坑

作者&投稿:束哀 (若有异议请与网页底部的电邮联系)
~

写在前面

小惊大怪

你是不是在用Python3或者在windows系统上编程?最重要的是你对进程和线程不是很清楚?那么恭喜你,在python分布式进程中,会有坑等着你去挖。。。(hahahaha,此处允许我吓唬一下你)开玩笑的啦,不过,如果你知道序列中不支持匿名函数,那这个坑就和你say byebye了。好了话不多数,直接进入正题。

分布式进程

正如大家所知道的Process比Thread更稳定,而且Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。

代码记录

举个例子

如果我们已经有一个通过Queue通信的多进程程序在同一台机器上运行,现在,由于处理任务的进程任务繁重,希望把发送任务的进程和处理任务的进程分布到两台机器上,这应该怎么用分布式进程来实现呢?你已经知道了原有的Queue可以继续使用,而且通过managers模块把Queue通过网络暴露出去,就可以让其他机器的进程来访问Queue了。好,那我们就这么干!

写个task_master.py

我们先看服务进程。服务进程负责启动Queue,把Queue注册到网络上,然后往Queue里面写入任务。

请注意,当我们在一台机器上写多进程程序时,创建的Queue可以直接拿来用,但是,在分布式多进程环境下,添加任务到Queue不可以直接对原始的task_queue进行操作,那样就绕过了QueueManager的封装,必须通过manager.get_task_queue()获得的Queue接口添加。然后,在另一台机器上启动任务进程(本机上启动也可以)

写个task_worker.py

任务进程要通过网络连接到服务进程,所以要指定服务进程的IP。

运行结果

现在,可以试试分布式进程的工作效果了。先启动task_master.py服务进程:

task_master.py进程发送完任务后,开始等待result队列的结果。现在启动task_worker.py进程:

看到没,结果都出错了,我们好好分析一下到底哪出错了。。。

错误分析

在task_master.py的报错提示中,我们知道它说lambda错误,这是因为序列化不支持匿名函数,所以我们得修改代码,重新对queue用QueueManager进行封装放到网络中。

其中task_queue和result_queue是两个队列,分别存放任务和结果。它们用来进行进程间通信,交换对象。

因为是分布式的环境,放入queue中的数据需要等待Workers机器运算处理后再进行读取,这样就需要对queue用QueueManager进行封装放到网络中,这是通过上面的2行代码来实现的。我们给return_task_queue的网络调用接口取了一个名get_task_queue,而return_result_queue的名字是get_result_queue,方便区分对哪个queue进行操作。task.put(n)即是对task_queue进行写入数据,相当于分配任务。而result.get()即是等待workers机器处理后返回的结果。

值得注意 在windows系统中你必须要写IP地址,而其他操作系统比如linux操作系统则就不要了。

修改后的代码

在task_master.py中修改如下:

在task_worker.py中修改如下:

先运行task_master.py,然后再运行task_worker.py

(1)task_master.py运行结果如下

(2)task_worker.py运行结果如下

知识补充

这个简单的Master/Worker模型有什么用?其实这就是一个简单但真正的分布式计算,把代码稍加改造,启动多个worker,就可以把任务分布到几台甚至几十台机器上,比如把计算n*n的代码换成发送邮件,就实现了邮件队列的异步发送。

Queue对象存储在哪?注意到task_worker.py中根本没有创建Queue的代码,所以,Queue对象存储在task_master.py进程中:

而Queue之所以能通过网络访问,就是通过QueueManager实现的。由于QueueManager管理的不止一个Queue,所以,要给每个Queue的网络调用接口起个名字,比如get_task_queue。task_worker这里的QueueManager注册的名字必须和task_manager中的一样。对比上面的例子,可以看出Queue对象从另一个进程通过网络传递了过来。只不过这里的传递和网络通信由QueueManager完成。

authkey有什么用?这是为了保证两台机器正常通信,不被其他机器恶意干扰。如果task_worker.py的authkey和task_master.py的authkey不一致,肯定连接不上。




各位能不能给推荐一个python的分布式爬虫框架
从GitHub中整理出的15个最受欢迎的Python开源框架。这些框架包括事件I\/O,OLAP,Web开发,高性能网络通信,测试,爬虫等。 Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。Django是走大而全......

如何入门 Python 爬虫
当然,我们假设每台机子都已经进了最大的效率——使用多线程(python的话,多进程吧)。3)集群化抓取爬取豆瓣的时候,我总共用了100多台机器昼夜不停地运行了一个月。想象如果只用一台机子你就得运行100个月了...那么,假设你现在有100台机器可以用,怎么用python实现一个分布式的爬取算法呢?我们把这100台中的99台...

没有django基础可以学慕课网的python分布式爬虫课程吗?
没有django基础也可以学,因为慕课 网 的python分布式爬虫课程中对django的应用比较简单,不过也就是提供搜索接口和展示搜索数据罢了,老师主要是讲scrapy和elasticsearch这部分内容,不过你学习这个课程也不能赤膊上阵,还是得需要具备一定的原生爬虫基础的,而且还得了解前端页面,面向对象概念,计算机网络协议和...

python基础学完了学什么
掌握三大Python后端框架,解决一切前后端Web开发问题● 阶段五:Web框架之Tornado● 阶段六:docker容器及服务发现● 阶段七:爬虫阶段目标:掌握分布式多线程大型爬虫技术,能开发企业级爬虫程序● 阶段八:数据挖掘和人工智能阶段目标:成为Python数据挖掘分析师,进入人工智能领域,成为IT市场最前沿人才 ...

Python有哪些常见的,好用的爬虫框架
cola:是一个分布式的爬虫框架,对于用户来说,只需编写几个特定的函数,而无需关注分布式运行的细节。任务会自动分配到多台机器上,整个过程对用户是透明的。项目整体设计有点糟,模块间耦合度较高。PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多...

Python性能测试框架Locust实战教程
Locust是一个易于上手的分布式用户负载测试工具,旨在对网站或系统进行负载测试,确定其最大并发用户数量。其运行原理基于事件,每个测试用户在独立进程中运行,使用gevent轻量级进程,不采用回调,从而在单机上支持数千个并发用户。Locust具有以下特点:用Python编写测试方案,无需UI操作,灵活性高;支持分布式与...

python和java效率差多少?
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。python Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的...

django如何分布式部署(2023年最新整理)
进入安全组,新建我们的开放端口,我开放的是80端口。如图8 开放端口后,我们重新pythonmanage.pyrunserver0.0.0.0:80,如图9 通过公网ip,就可以直接访问我们的网站了。如图10 结语:以上就是首席CTO笔记为大家整理的关于django如何分布式部署的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,...

Python初学者怎么入门
第三阶段数据分析+人工智能。这部分主要是学习爬虫相关的知识点,你需要掌握数据抓取、数据提取、数据存储、爬虫并发、动态网页抓取、scrapy框架、分布式爬虫、爬虫攻防、数据结构、算法等知识。第四阶段高级进阶。这是Python高级知识点,你需要学习项目开发流程、部署、高并发、性能调优、Go语言基础、区块链入门...

如何入门 Python 爬虫
从爬虫必要的几个基本需求来讲:1.抓取 python的urllib不一定去用,但是要学,如果还没用过的话。比较好的替代品有requests等第三方更人性化、成熟的库,如果pyer不了解各种库,那就白学了。抓取最基本就是拉网页回来。如果深入做下去,会发现要面对不同的网页要求,比如有认证的,不同文件格式、编码...

分宜县18431777890: python写代码中经常遇到的几种错误 -
泷司米诺: SyntaxError: 'return' outside function 解决:将return放在方法体中 return不能在方法以外使用TypeError: must be str, not int 类型错误 必须是一个字符串 不能是数字 解决办法:使用+拼接的时候 必须使用字符串,或者将数字转化成字符串...

分宜县18431777890: python初学者遇到的弱智问题 -
泷司米诺: 晕死,这位大侠大侠你把我打败了.我告诉你怎么用IDLE吧: 1、点开IDLE,在“python shell”窗口的左上角点“File”中点开一个“New Window”, 2、再在新打开的“New Window”窗口的编辑区内编写代码. 3、编写完后再在新打开的“...

分宜县18431777890: 分布式环境中什么情况下会出现死锁与饿死 -
泷司米诺: 饥饿是什么?是进程无法得到资源,(cpu或者io资源或者别的什么资源),所以无法进行下去,称为饿死,比较常见的就是在优先级调度中,不停的有高优先级的进程创建,导致的无法分配cpu,从而饥饿.而按照《操作系统概念》当中介绍的...

分宜县18431777890: python 分布式进程用的多吗 -
泷司米诺: Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情.借助这个包,可以轻松完成从单进程到并发执行的转换.1、新建单一进程 如果我们新建少量进程,可以如下:import ...

分宜县18431777890: 求助python的MemoryError问题 -
泷司米诺: 通常不会遇到这个问题.python解决小问题不会有memory error 可能是使用了大对象也可能是使用了递归.没有合适规划临时或者是堆栈数据的数量.那么有问题大部分是因为dict或者是list太大了.解决办法是使用优化过的数据结构,比如blist...

分宜县18431777890: python自学以后该怎么做 -
泷司米诺: 学习Python,如果不是系统学习,自学总会遇到很多弯路,但是看到书以后,还是会从头看到尾,但是不知道重点在哪里 学习方法:先确定学习的思想 确定学习的方向 确定学习的重点1.确定学习思想 学习编程,学的不是代码,代码可以给你,...

分宜县18431777890: Python新手写程序没有思路怎么办 -
泷司米诺: 对于Python新手,在刚开始学习Python的时候,总会遇到这样的一个问题:学习了相关教程,也明白相关的规则,但是给出一个功能,却无从下手,不知道怎么去实现,或者知道怎么去实现,就是写不出来,这个问题该如何解决呢? 出现以上...

分宜县18431777890: python socket udp编程的小问题 -
泷司米诺: 从错误代码an integer is required来看,需要提供一个整形.要做的是改成 port0 = 21567,而不是 port0 = '21567'.希望能帮到你,有疑问请追问!

分宜县18431777890: python编程中遇到的一个问题
泷司米诺: c=[100-3*(a+1)-2*(b+1)]*3你这样算出来c是个列表,应该写成 c=(100-3*(a+1)-2*(b+1))*3

分宜县18431777890: python 程序假死的问题 -
泷司米诺: 我遇到的这种现象常见在引用占用了大量的系统内存, 后来我将直接读入大量数据到内存的过程改为用iter读取, 现象没再出现.你的方案"超过一定时间...", 可以视为"守护进程", 如果这个进程是你的应用内的某个线程, 恐怕它会一同"睡"去 :(.. 还是先确认一下是否是内存占用的原因吧, 如果是通过节省内存的方式可以克服的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网