【问题标题】:Why is multiprocessing.manager in python behaving weirdly?为什么 python 中的 multiprocessing.manager 行为怪异?
【发布时间】:2021-08-29 05:23:15
【问题描述】:

当我运行它并输入一些内容时,它会进入主函数,但随后又要求输入。为什么会发生这种情况? 我在 Windows 中使用命令提示符运行。版本是 3.8

import multiprocessing
from concurrent.futures import ProcessPoolExecutor
import concurrent.futures


input('?')

def pp(id,lock):
    with lock:
        for i in range(5):          
            print(f'{id}=>{i}')

def main():
    pool = ProcessPoolExecutor()
    m = multiprocessing.Manager()
    lock = m.Lock()
    futures = [pool.submit(pp, num,lock) for num in range(10)]
    with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
        executor.map(main, list(range(10)),[lock]*10)       
if __name__=='__main__':
    main()  

这是输出:

?abc
?abd
????

如何解决这个问题,让它只运行一次输入?

【问题讨论】:

  • 你是如何运行它的?
  • 我也使用 pyinstaller 将它作为 .exe 运行.. 但这也有同样的问题

标签: python python-multiprocessing main concurrent.futures


【解决方案1】:

我无法重现,它只在我的本地 Python 上运行一次。 你的 Python 版本是多少?

不过,我建议将input 放在if __name__ == "main" 中。问题是每当您导入模块时都会调用您的输入,可以在导入 main 函数时由线程完成。

注意:很抱歉没有发表评论,但我不能以低于 50 的声誉发表评论。

【讨论】:

  • 请再次检查编辑。放入 if 语句是可行的.. 但为什么首先会发生这种情况?
  • 此外,当我使用 pyinstaller 将其转换为 exe 时,即使将输入放在 if 语句中也无法正常工作!
  • 如前所述,我认为它为每个核心(?)创建了模块的“副本”。因此,程序需要多次导入模块(不知道为什么是3,你有3核吗?)。
猜你喜欢
  • 2016-08-24
  • 2012-07-02
  • 2022-10-15
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 2021-04-06
相关资源
最近更新 更多