zoukankan      html  css  js  c++  java
  • python_分布式进程中遇到的问题

    看文档学习分布式进程中遇到了一下问题,文档里面例题是python2.X,我用的python3.x,就出现了一下莫名奇妙的问题,最终版代码先呈上:

    taskManager.py

     1 # coding:utf-8
     2 # taskManager.py  for  windows  服务器端
     3 
     4 import queue
     5 from multiprocessing.managers import BaseManager
     6 from multiprocessing import freeze_support
     7 # 任务个数
     8 task_number = 10
     9 # 定义收发队列
    10 task_queue = queue.Queue(task_number);
    11 result_queue = queue.Queue(task_number);
    12 def get_task():
    13     return task_queue
    14 def get_result():
    15     return result_queue
    16 #创建类似的QueueManager:
    17 class QueueManager(BaseManager):
    18     pass
    19 def win_run():
    20     # Windows 下绑定调用接口不能使用lambda,所以只能先定义函数再绑定
    21     QueueManager.register('get_task_queue',callable = get_task)
    22     QueueManager.register('get_result_queue',callable=get_result)
    23     #绑定端口并设置验证口令,windows下需要填写IP地址,Linux下不填默认为本地 ip地址为本地ip地址
    24     manager = QueueManager(address = ('192.xxx.xx.xxx',8001),authkey =b'qiye')
    25     # 启动
    26     manager.start()
    27     try:
    28         # 通过网络获取任务队列和结果队列
    29         task = manager.get_task_queue()
    30         result = manager.get_result_queue()
    31         #添加任务
    32         for url in ["ImageUrl_"+str(i) for i in range(10)]:
    33             print('put task %s ...'%url)
    34             task.put(url)
    35         print('try get result...')
    36         for i in range(10):
    37             print('result is %s' %result.get(timeout=10))
    38     except:
    39         print('Manager error')
    40     finally:
    41         # 一定要关闭,否则会报管道未关闭的错误
    42         manager.shutdown()
    43 
    44 if __name__=='__main__':
    45     # Windows 下多进程可能会有问题,添加这句可以缓解
    46     freeze_support()
    47     win_run()

    taskWorker.py

     1 # coding:utf-8
     2 import time
     3 from multiprocessing.managers import BaseManager
     4 # 创建类似的 QueueManager:
     5 class QueueManager(BaseManager):
     6     pass
     7 #第一步: 使用QueueManager注册用于获取Queue的方法名称
     8 QueueManager.register('get_task_queue')
     9 QueueManager.register('get_result_queue')
    10 #第二步:连接到服务器:
    11 server_addr = '192.xxx.xx.xxx'
    12 print('Connect to server %s...'%server_addr)
    13 #端口和验证口令注意保持与服务器进程保持一致:
    14 m = QueueManager(address=(server_addr,8001),authkey=b'qiye')
    15 #从网络连接
    16 m.connect()
    17 #第三部:获取Queue的对象:
    18 task = m.get_task_queue()
    19 result = m.get_result_queue()
    20 #第四步:从task队列获取任务,并把结果写入result队列:
    21 while(not task.empty()):
    22     image_url = task.get(True,timeout = 5)
    23     print('run task download %s ...'%image_url)
    24     time.sleep(1)
    25     result.put('%s--->success'%image_url)
    26 #处理结束
    27 print('worker exit.')

    先运行 taskManager.py 服务器端代码,再快速运行 taskWorker.py 客户端代码 运行结果依次如下:

  • 相关阅读:
    游戏引擎中的光照算法
    深入剖析GPU Early Z优化
    UE4联机编译光照
    深入剖析MSAA
    Unity 使用xLua遇到的坑
    扩展SQLite使其能从apk文件中读取db
    tolua#代码简要分析
    虚幻4垃圾回收剖析
    虚幻4蓝图虚拟机剖析
    java转成xml
  • 原文地址:https://www.cnblogs.com/loveMessi/p/10774619.html
Copyright © 2011-2022 走看看