草庐IT

Python multiprocessing.Queue 与 multiprocessing.manager().Queue()

coder 2023-05-23 原文

我有这样一个简单的任务:

def worker(queue):
    while True:
        try:
            _ = queue.get_nowait()
        except Queue.Empty:
            break

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    # queue = multiprocessing.Queue()
    queue = manager.Queue()

    for i in range(5):
        queue.put(i)

    processes = []

    for i in range(2):
        proc = multiprocessing.Process(target=worker, args=(queue,))
        processes.append(proc)
        proc.start()

    for proc in processes:
        proc.join()

似乎 multiprocessing.Queue 可以完成我需要的所有工作,但另一方面,我看到许多 manager().Queue() 的示例,无法理解我真正需要什么。看起来像 Manager().Queue() 使用某种代理对象,但我不明白这些目的,因为 multiprocessing.Queue() 在没有任何代理对象的情况下做同样的工作。

所以,我的问题是:

1) multiprocessing.Queue 和 multiprocessing.manager().Queue() 返回的对象有什么区别?

2) 我需要使用什么?

最佳答案

虽然我对这个主题的理解有限,但从我所做的事情来看,multiprocessing.Queue() 和 multiprocessing.Manager().Queue() 之间存在一个主要区别:

  • multiprocessing.Queue() 是一个对象,而 multiprocessing.Manager().Queue() 是一个地址(代理),指向由 multiprocessing.Manager() 对象管理的共享队列。
  • 因此您不能将普通的 multiprocessing.Queue() 对象传递给 Pool 方法,因为它不能被腌制。
  • 此外,python doc告诉我们在使用 multiprocessing.Queue() 时要特别注意,因为它可能会产生不良影响

Note When an object is put on a queue, the object is pickled and a background thread later flushes the pickled data to an underlying pipe. This has some consequences which are a little surprising, but should not cause any practical difficulties – if they really bother you then you can instead use a queue created with a manager. After putting an object on an empty queue there may be an infinitesimal delay before the queue’s empty() method returns False and get_nowait() can return without raising Queue.Empty. If multiple processes are enqueuing objects, it is possible for the objects to be received at the other end out-of-order. However, objects enqueued by the same process will always be in the expected order with respect to each other.

Warning As mentioned above, if a child process has put items on a queue (and it has not used JoinableQueue.cancel_join_thread), then that process will not terminate until all buffered items have been flushed to the pipe. This means that if you try joining that process you may get a deadlock unless you are sure that all items which have been put on the queue have been consumed. Similarly, if the child process is non-daemonic then the parent process may hang on exit when it tries to join all its non-daemonic children. Note that a queue created using a manager does not have this issue.

通过将队列设置为全局变量并在初始化时为所有进程设置它,可以将 multiprocessing.Queue() 与 Pool 一起使用:

queue = multiprocessing.Queue()
def initialize_shared(q):
    global queue
    queue=q

pool= Pool(nb_process,initializer=initialize_shared, initargs(queue,))

将创建具有正确共享队列的池进程,但我们可以争辩说 multiprocessing.Queue() 对象不是为此用途而创建的。

另一方面,manager.Queue() 可以在池子进程之间共享,方法是将它作为函数的普通参数传递。

在我看来,使用 multiprocessing.Manager().Queue() 在任何情况下都很好,而且麻烦更少。使用经理可能会有一些缺点,但我不知道。

关于Python multiprocessing.Queue 与 multiprocessing.manager().Queue(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43439194/

有关Python multiprocessing.Queue 与 multiprocessing.manager().Queue()的更多相关文章

  1. ruby - Chromedriver `driver.manage.logs.get(:browser)` 在 chromedriver 75.0.3770.8 上失败 - 2

    在chromedriver75.0.3770.8上访问driver.manage.logs.get(:browser)-它导致错误#(NoMethodError)的未定义方法“日志”在74.0.3729.6上工作正常来自:https://github.com/SeleniumHQ/selenium/issues/7270 最佳答案 在最近的selenium-webdriver(4.4.0)和最近的Chrome(105)中,manage.logs不见了,但这有效:page.driver.browser.logs.get(:browse

  2. ruby-on-rails - 有可能 CanCan can :manage, :all except one or more method? - 2

    我在做:can:manage,:allifuser.role=='admin'can:approve,Anunciodo|anuncio|anuncio.try(:aprovado)==falseend我的第二种方法不起作用,因为:manage:all覆盖了它。有一种方法可以声明可以管理除批准之外的所有内容吗?在里面批准我只是做can:approve,Anunciodo|anuncio|user.role=='admin'&&anuncio.try(:aprovado)==falseend什么是更好的解决方案? 最佳答案 尝试换一种

  3. ruby-on-rails - 如何允许 Facebook 页面管理员仅选择他们希望我的应用程序管理的特定页面(manage_pages) - 2

    我正在使用RubyonRails和Koalagem构建一个facebook应用程序来构建我自己的登录流程。https://github.com/arsduo/koalahttps://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/我的问题很简单。假设以下情况:-尝试连接到我的应用程序的用户有多个他们管理的Facebook页面。我希望他们能够只选择他们希望我管理的特定页面,同时拒绝访问其余页面。原因是许多将使用我的应用程序的管理员管理大量页面。当我只需要一小部分页面的权限时,我无法想象他们会

  4. Internet Download Manager2023最好用的HTTP下载神器 - 2

    InternetDownloadManager介绍2023最佳下载利器。InternetDownloadManager(简称IDM)是一款Windows平台功能强大的多线程下载工具,国外非常受欢迎。支持断点续传,支持嗅探视频音频,接管所有浏览器,具有站点抓取、批量下载队列、计划任务下载,自动识别文件名、静默下载、网盘下载支持等功能。一款下载器软件,也可以叫它网页嗅探下载工具可以理解为和迅雷差不多,但是没有迅雷那么多广告,而且功能也更加强大(ps:我也是不久前知道迅雷可以下载网页的视频了)。这是一款互联网下载管理器,看着名字挺长的,但它还有一个简称,你一定知道:IDM,在很多论坛技术贴中被称为H

  5. ARM异常处理(3):Bus faults、Memory management faults、Usage faults、Hard faults详解 - 2

    之前介绍了了ARM异常处理(1):异常类型、优先级分组和异常向量表,里面有很多异常类型,其中有几个异常在错误处理中非常有用:文章目录1BusFault2MemoryManagementFault3Uagefaults4HardFaults1BusFault当在AHB接口上传输期间收到错误响应时,就会产生Busfault。它可能发生在以下几个阶段:指令预取阶段,通常称为prefetchabort数据读/写阶段,通常称为dataabort在Cortex-M3中,出现下面几种情况也会产生Busfault:堆栈在中断处理的开始处PUSH,称为stackingerror堆栈在中断处理的结束处POP,称为

  6. javascript - queue.js 是如何工作的? - 2

    我一直在努力理解MikeBostock'squeue.js有效,但我看不到它是如何工作的。我不明白的部分是代码如何设法继续执行回调。特别是,我不确定pop()方法(第45行)。据我了解,该方法采用下一个未处理的延迟函数;附加一个回调,它(可能)启动队列中的下一个延迟函数,并在立即弹出的函数完成时执行;然后最终执行所述功能。我的问题是:什么代码执行这个回调? 最佳答案 每个延迟函数实际上并不返回任何东西——它们应该作为回调执行它们的最终参数。例如,这将不起作用varfoo=function(i){console.log(i);retu

  7. javascript - webdriver-manager 更新错误 : EACCES, 权限被拒绝 - 2

    我曾经成功地运行Protractor测试(在Mac上)并且我尝试升级版本,所以我运行了$npminstall-gprotractor它看起来很有效——在运行时$protractor--version我明白了Version1.8.0但是现在,在运行时$webdriver-managerstart我明白了fs.js:642returnbinding.mkdir(pathModule._makeLong(path),^Error:EACCES,permissiondenied'/usr/local/lib/node_modules/protractor/selenium'atObject.f

  8. JavaScript 事件循环 : Queue vs Message Queue vs Event Queue - 2

    阅读了大量的JavaScript事件循环教程,我看到了不同的术语来标识队列存储消息,当调用堆栈为空时,事件循环准备好获取消息:队列消息队列事件队列我找不到规范的术语来识别它。甚至MDN似乎也对theEventLooppage感到困惑因为它首先称它为队列,然后是消息队列,但在标签中我看到了事件队列。循环的这一部分是否在某处进行了详细定义,或者它只是一个没有“固定”名称的实现细节? 最佳答案 问得好,我也提倡使用正确的术语。队列、消息队列和事件队列指的是同一个构造(事件循环队列)。此构造具有在事件循环中触发的回调。有趣的是,有两个不同的

  9. javascript - Node/npm : How to manage globally installed devDependencies - 2

    我正在构建一个带有应该全局安装的devDependencies的Node模块,例如jasmine-node和jshint。我本质上需要的是能够在我的makefile/npm脚本部分引用它们的二进制文件以运行测试、lint等。换句话说,我不希望以编程方式require()它们。在四处挖掘之后,我仍然对如何处理这个问题感到困惑:1)我的第一个方法是假设这些模块将全局安装,在我的模块文档中阐明这一点并将它们的二进制文件引用为全局变量——即期望它们全局可用。这与这条建议冲突Makesureyouavoidreferencinggloballyinstalledbinaries.Instead,

  10. javascript - 查询。 queue() 与使用回调函数有何不同? - 2

    html:helloworld!js:(使用回调)$('span').click(function(){$(this).animate({fontSize:'+=10px'},'slow',function(){//callbackafterfontsizeincreased$(this).text($(this).text()+'rolled!');});});因此每次单击SPAN时,文本都会在字体大小增加后“滚动”附加,而不是一起发生。它也可以通过使用queue()来完成,就像这样:js:(使用队列())$('span').click(function(){$(this).anim

随机推荐