账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    windows下分布式进程问题,得到的队列管理类对象在调用注册的方法后,调用管理实例的方法报错没有该方法!十分感谢!
    33
    0

    创建服务进程总共需要六步

    import time,random,queue,sys
    from multiprocessing.managers import BaseManager
    from multiprocessing import freeze_support
    class QueueManager(BaseManager):

    pass

    第一步,创建两个队列

    task_number = 10
    task_queue = queue.Queue(task_number)
    result_queue = queue.Queue(task_number)

    第二步,注册两个队列到网络,利用的是register方法,在回调函数里传入相应的队列对象

    windows下绑定调用接口不能使用lambda,所以只能先定义函数再绑定

    def get_task():

    return task_queue

    def get_result():

    return result_queue

    def server_start():

    QueueManager.register('get_task_queue',callable=get_task)#callable 接收的实际是一个函数
    QueueManager.register('get_result_queue',callable=get_result)
    #第三步,创建管理类实例,绑定端口和验证口令
    manager = QueueManager(address=('127.0.0.1',5000),authkey=b'oliver')#这里必须要转换成字节流不能是字符串
    #第四步,启动管理类,监听通信信道
    manager.start()
    #第五步,通过管理实例方法获得网络访问的Queue对象,因为服务器进程要发布任务
    try:
        task = manager.get_task_queue()
        result = manager.get_result_queue()
        #第六步,添加相应的任务
        for url in ['ImageUrl_' + str(i) for i in range(10)]:
            print('put url:%s'%(url))
            task.put(url)
        #获取返回结果
        print('try get result..')
        for i in range(10):
            print('result is %s '%result.get(timeout = 10))
    except:
        print('Manager error')
    finally:
        manager.shutdown()

    if name == '__main__':

    freeze_support()
    server_start()
    
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 落在谁的指尖 普通会员 1楼

      在Windows环境下,你可能遇到一个错误,表明你尝试调用的注册方法并未在Queue类的Handle属性中找到。这可能是因为你的Queue实例并未被正确初始化,或者是在注册方法中忘记传递任何参数。

      在Python中,你可以使用Queue类的register方法来注册一个队列实例。然后,你可以使用Queue类的Handle属性来访问队列实例。

      如果你使用的是C++的Queue类,你可以使用std::queue命名空间中的queue成员函数来注册一个队列实例。然后,你可以使用queue成员函数来访问队列实例。

      在Python中,你可能需要使用Queue类的__init__方法来初始化Queue实例,然后使用Queue类的Handle属性来访问Queue实例。你可能还需要在注册方法中提供一个参数,以指示要注册的队列实例。

      在C++中,你可能需要使用std::queue命名空间中的queue类的operator newoperator delete函数来注册一个队列实例,然后使用queue类的成员函数来访问Queue实例。你可能还需要在注册方法中提供一个参数,以指示要注册的队列实例。

      如果你在Windows环境下遇到这个错误,你可以尝试使用上述方法来解决。如果你在C++环境下遇到这个错误,你可以尝试使用上述方法来解决。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部