python进程通信遇到的问题

学习python爬虫的时候,正好看到要用到分布式的案例。

于是自己直接拿来用了。
类似的代码网上一大堆。

先贴出代码
  • taskManager.py

‘’’

import random, time
import queue #队列在py2中 'q' 大写 在py3中小写
from multiprocessing.managers import BaseManager

#setp 1:建立task_queue和result_queue,用来存放任务和结果
task_queue = queue.Queue()
result_queue = queue.Queue()

class QueueManager(BaseManager):
    pass


#setp 2:把创建的两个队列注册在网络上,利用register方法,callable参数关联了Queue对象,将Queue对象在网络中暴露.
QueueManager.register('get_task_queue', callable=lambda:task_queue)
QueueManager.register('get_result_queue', callable=lambda:result_queue)#callable对应的是一个函数

#setp 3:绑定端口8080,设置验证口令'hello'.这个相当于对象初始化
manager = QueueManager(address=('127.0.0.1', 8080), authkey='hello'.encode('utf-8'))

#setp 4:启动管理,监听信息通道
manager.start()

#setp 5:通过管理器实例方法获得通过网络访问的Queue对象
task = manager.get_task_queue()
result = manager.get_result_queue()

#setp 6:添加任务
for url in ['ImageUrl_'+str(i) for i in range(10)]:#列表推导式,好家伙,多用
    print('put task {}'.format(url));
    task.put(url)

#获取返回结果
print('try get result')
for i in range(10):
    print('result is {}'.format(result.get(timeout=10)))#Queue.get() -> pop value

#关闭管理
manager.shutdown()

‘’’

  • taskWorker.py

‘’’

#!coding=utf-8

import time
from multiprocessing.managers import BaseManager

#创建类似的QueueManager
class QueueManager(BaseManager):
    pass #继承了类

#setp 1:使用QueueManager注册用于获取Queue的方法名称
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

#setp 2:连接到服务器
server_addr = '192.168.8.194'
#erver_addr = '127.0.0.1'
print('Connect to server {} ...'.format(server_addr))

#端口和验证口令注意保持与服务进程完全一致
m = QueueManager(address=(server_addr, 6500))#, authkey='hello'.encode('utf-8'))

#从网络连接
m.connect()

#step 3:获取Queue对象
task = m.get_task_queue()
result = m.get_result_queue()

#setp 4:从task队列中获取任务,并把结果写入result队列
while(not task.empty()):
    image_url = task.get(True, timeout=5)
    print('run task download {} ...'.format(image_url))
    time.sleep(1)
    result.put('{}---->success'.format(image_url))

‘’’

  • 相信有python基础的都能看的懂。

成功的实验

首先配置一下taskWorker.py中的ip地址,如果懒的配就把server_addr直接设置成server_addr='localhost’就行了,taskWorker.py中的server_addr设置成和taskWorker.py中的一样就行了。
然后我把这两个脚本放在一台电脑中运行,没有问题,一切都很正常。
具体现象就不贴出来了,相信把上面两个脚本运行一下就行了。

失败的实验

.因为是要了解分布式。当然要在不同的电脑上试试了。
刚好身边有两台电脑~~~,于是我把上述两个脚本分别放在两台电脑上运行。
……问题来了,无论我怎么实验都没有通信成功。

迷之原因

我又看了些进程间通信的文章,发现大都提到子进程间通信。这下有点明白了。
两台主机的进程是两个完全互相独立的进程,没有父子关系,也没有兄弟之情。所以是不能用队列直接进行通信的,
而上述的通信手段就是使用队列。这个时候就需要使用消息中间件了。比如rabbitMQ。
怪就怪涉世未深。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值