Python多处理标准输入

用户名

所有代码均在python 3.4 Windows 7上编写和测试。

我正在设计一个控制台应用程序,需要从命令行(win os)使用stdin发出命令并更改程序的操作模式。该程序依靠多处理来处理cpu绑定负载,以分散到多个处理器。

我正在使用stdout监视状态和一些基本的返回信息,并使用stdin发出命令以根据返回的控制台信息加载不同的子进程。

这是我发现问题的地方。我无法使多处理模块接受stdin输入,但stdout正常运行。我认为在堆栈上找到了以下帮助,因此我对其进行了测试,发现它与线程模块都很好用,除了由于std阻塞而用GIL锁定导致每次stdin循环之前,stdout的所有输出都被暂停了。

我会说我已经成功完成了msvcrt.kbhit()的实现。但是,我不禁要问,多处理功能中是否存在某种错误,这些错误使stdin无法读取任何数据。我尝试了多种方法,但在使用多处理时却无济于事。甚至尝试使用队列,但我没有尝试使用池或多处理中的任何其他方法。

我也没有在Linux机器上尝试此操作,因为我一直致力于使它工作。

这是简化的测试代码,无法正常运行(请注意,这是用Python 3.4-win7编写的):

import sys
import time
from multiprocessing import Process

def function1():
    while True:
        print("Function 1")
        time.sleep(1.33)

def function2():
    while True:
        print("Function 2")
        c = sys.stdin.read(1) # Does not appear to be waiting for read before continuing loop.
        sys.stdout.write(c) #nothing  in 'c'
        sys.stdout.write(".") #checking to see if it works at all.
        print(str(c)) #trying something else, still nothing in 'c'
        time.sleep(1.66)

if __name__ == "__main__":
    p1 = Process(target=function1)
    p2 = Process(target=function2)
    p1.start()
    p2.start()

希望有人可以阐明这是预期的功能,如果我没有正确实现的话,还是其他有用的信息。

谢谢。

维克多

当您查看Python的实现时,multiprocessing.Process._bootstrap()您会看到以下内容:

if sys.stdin is not None:
    try:
        sys.stdin.close()
        sys.stdin = open(os.devnull)
    except (OSError, ValueError):
        pass

您也可以使用以下方法进行确认:

>>> import sys
>>> import multiprocessing
>>> def func():
...     print(sys.stdin)
... 
>>> p = multiprocessing.Process(target=func)
>>> p.start()
>>> <_io.TextIOWrapper name='/dev/null' mode='r' encoding='UTF-8'>

并从os.devnull立即读取返回空结果:

>>> import os
>>> f = open(os.devnull)
>>> f.read(1)
''

您可以使用以下方法解决此问题open(0)

file是一个字符串或字节对象,给出要打开的文件的路径名(绝对或相对于当前工作目录),或者是要包装的文件整数文件描述符(如果给出了文件描述符,则除非将closefd设置为False,否则当关闭返回的I / O对象时,它将关闭。)

0文件描述符

文件描述符是与当前进程已打开的文件相对应的小整数。例如,标准输入通常是文件描述符0,标准输出是1,标准错误是2:

>>> def func():
...     sys.stdin = open(0)
...     print(sys.stdin)
...     c = sys.stdin.read(1)
...     print('Got', c)
... 
>>> multiprocessing.Process(target=func).start()
>>> <_io.TextIOWrapper name=0 mode='r' encoding='UTF-8'>
Got a

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章