马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好~~我在用 multiprocessing 包创建子进程时,发现了如下现象:我在子进程里调用了 input() 函数,结果就报了 EOFError 的错。具体如下:
这是我的代码:import multiprocessing
def fun1():
s = input('请输入:')
print(s)
if __name__ == '__main__':
proc1 = multiprocessing.Process(target=fun1)
proc1.start()
这是错误信息:C:\Users\yy\AppData\Local\Microsoft\WindowsApps\python3.9.exe F:/python_test/main.py
请输入:Process Process-1:
Traceback (most recent call last):
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2032.0_x64__qbz5n2kfra8p0\lib\multiprocessing\process.py", line 315, in _bootstrap
self.run()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2032.0_x64__qbz5n2kfra8p0\lib\multiprocessing\process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "F:\python_test\main.py", line 77, in fun1
s = input('请输入:')
EOFError: EOF when reading a line
我的问题是:
1. 造成这个问题的原因是?我感觉是 input() 函数有什么特别的东西。
2. 如果我想在子进程 proc1 中执行类似 input() 的功能,应该调用什么函数呢?
感觉大家阅读~~
本帖最后由 hrpzcf 于 2021-11-24 13:08 编辑
子进程要打开标准输入输出流才能输入输出import sys
import os
import multiprocessing
def fun1(mainpid):
if os.getpid() != mainpid: # os.getpid()获取当前进程id,如果跟mainpid不相等则说明是新进程
print("是子进程,打开标准输入输出流...")
# 以下两句为子进程打开标准输入输出流
sys.stdin = os.fdopen(0, "r") # 打开标准输入流
sys.stdout = os.fdopen(1, "w") # 打开标准输出流
s = input("请输入:")
print(s)
if __name__ == "__main__":
mainpid = os.getpid() # 获取当前进程id
proc1 = multiprocessing.Process(target=fun1, args=(mainpid,))
# 不能像下面一行这样将子进程设置为守护进程,否则主进程结束后子进程也跟着结束,一样不能输入
# 如果一定要用这句设置守护进程,那主进程应该等待子进程结束,即末尾加 proc1.join()
# proc1.daemon = True
proc1.start()
# proc1.join()
|