如何在Python的concurrent.futures进程池函数中获取用户输入?
问题:ProcessPoolExecutor中调用input()引发EOFError
我尝试运行一个名为function的函数,在其中通过input()获取用户输入并存储到变量string中,函数结束时返回该变量。随后将此函数提交给futures.ProcessPoolExecutor执行,最后打印执行结果。代码如下:
#!/usr/bin/python3 from concurrent import futures def function(): string = input("Input: ") return string executor = futures.ProcessPoolExecutor() process = executor.submit(function) print(process.result())
问题现象:运行脚本后,出现如下错误,且无法进行输入:
Input: concurrent.futures.process._RemoteTraceback: """ Traceback (most recent call last): File "/usr/lib/python3.7/concurrent/futures/process.py", line 232, in _process_worker r = call_item.fn(*call_item.args, **call_item.kwargs) File "./TestScript.py", line 6, in function string = input("Input: ") EOFError: EOF when reading a line """ The above exception was the direct cause of the following exception: Traceback (most recent call last): File "./TestScript.py", line 13, in <module> print (process.result()) File "/usr/lib/python3.7/concurrent/futures/_base.py", line 432, in result return self.__get_result() File "/usr/lib/python3.7/concurrent/futures/_base.py", line 384, in __get_result raise self._exception EOFError: EOF when reading a line
原因分析
ProcessPoolExecutor会创建独立的子进程执行任务,子进程默认不会继承父进程的标准输入(stdin)。当子进程里的input()尝试读取输入时,因为没有可用的输入流,直接触发了EOFError。
解决方案
把用户输入操作放在主进程中完成,再将输入内容作为参数传给子进程的函数,避免在子进程中操作标准输入。修改后的代码如下:
#!/usr/bin/python3 from concurrent import futures def function(user_input): return user_input # 主进程中获取输入 user_input = input("Input: ") executor = futures.ProcessPoolExecutor() process = executor.submit(function, user_input) print(process.result())
补充说明
ProcessPoolExecutor的设计初衷是处理CPU密集型任务,这类任务不需要和用户交互;如果是需要交互的逻辑,直接在主进程执行即可,没必要用进程池。- 子进程和主进程拥有完全独立的资源空间,包括标准输入输出流,所以子进程无法直接访问主进程的输入流。
内容的提问来源于stack exchange,提问作者MimisLovesToProgram
相关产品推荐
相关产品推荐

