Discuss / Python / Windows 7环境下代码运行错误的解决方法

Windows 7环境下代码运行错误的解决方法

Topic source

三尺蛮腰

#1 Created at ... [Delete] [Delete and Lock User]

廖老师给出的示例代码在Mac OS X下运行良好 但是在Windows 7环境task_master.py会出现问题 需要修改三个地方

第一: 以下两句register内不要使用lambda

QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)

改成以下方法:

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

QueueManager.register('get_task_queue', callable=return_task_queue)
QueueManager.register('get_result_queue', callable=return_result_queue)

第二: 创建manager时加上IP地址。

# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')

第三: 整个代码用 if __name__ == '__main__':语句包起来, 并在一开始增加freeze_support()调用

最后附上完整的task_master.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random, time, queue
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
    pass

def return_task_queue():
    global task_queue
    return task_queue

def return_result_queue():
    global result_queue
    return result_queue

def test():
    # 把两个Queue都注册到网络上, callable参数关联了Queue对象:
    # QueueManager.register('get_task_queue', callable=lambda: task_queue)
    # QueueManager.register('get_result_queue', callable=lambda: result_queue)
    QueueManager.register('get_task_queue', callable=return_task_queue)
    QueueManager.register('get_result_queue', callable=return_result_queue)

    # 绑定端口5000, 设置验证码'abc':
    manager = QueueManager(address=('127.0.0.1', 5000), authkey=b'abc')
    # 启动Queue:
    manager.start()
    # 获得通过网络访问的Queue对象:
    task = manager.get_task_queue()
    result = manager.get_result_queue()
    # 放几个任务进去:
    for i in range(10):
        n = random.randint(0, 10000)
        print('Put task %d...' % n)
        task.put(n)
    # 从result队列读取结果:
    print('Try get results...')
    for i in range(10):
        r = result.get(timeout=10)
        print('Result: %s' % r)
    # 关闭:
    manager.shutdown()
    print('master exit.')

if __name__ == '__main__':
    freeze_support()
    test()

叫小小兽

#2 Created at ... [Delete] [Delete and Lock User]

也就只能复制粘贴跑一遍了,要我自己写完全不会下手。。。

global task_queue

这一句应该没有必要加,函数内没有使用声明,默认查找全局

啊呜说

#4 Created at ... [Delete] [Delete and Lock User]
QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)

可以改成

task_queue =queue.Queue
result_queue=queue.Queue

QueueManager.register('get_task_queue',callable=task_queue)
QueueManager.register('get_result_queue',callable=result_queue)

或者

QueueManager.register('get_task_queue',task_queue)
QueueManager.register('get_result_queue',result_queue)

我估计callable本身想要的就是函数指向吧 
我是在看manager实现的时候发现的 他们自己居然是这么写的
SyncManager.register('Queue', queue.Queue)
SyncManager.register('JoinableQueue', queue.Queue)

感谢楼楼的分享

感谢,我按照你的改好了

一雷叔一

#6 Created at ... [Delete] [Delete and Lock User]

感谢大牛分享, 虽然看不懂, 但是按照大牛的修改方式,在WIN7 上运行成功了~~

fridayily

#7 Created at ... [Delete] [Delete and Lock User]

谢谢,照你的改好了


  • 1

Reply