微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python多处理stdininput

所有代码在python 3.4 windows 7上编写和testing。

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

我使用stdout来监视这个状态和一些基本的返回信息,stdin根据返回的控制台信息发出命令来加载不同的subprocess。

这是我发现问题的地方。 我不能让多处理模块接受stdininput,但stdout工作得很好。 我认为在栈上find了以下的帮助所以我testing了它,发现使用线程模块,这一切都很好,除了所有的输出到标准输出都暂停,直到每次标准input由于GIL锁使用标准input阻塞循环。

当从脚本文件扩展名关联运行时,python多处理在Windows 7上失败

与大型数组的Windows上的Python多处理

可以在cmd中启动多个命令的线程?

POSIX名为Semaphore存储在哪里?

发送TERM信号给在父进程的另一个线程中产生的subprocess

我会说我已经用msvcrt.kbhit()实现了解决scheme。 然而,我不禁要问,在多处理function中是否有某种错误使stdin不能读取任何数据。 我尝试了很多方法,并且在使用多处理时没有任何工作。 即使尝试使用队列,但我没有尝试池,或从多处理的任何其他方法

我也没有尝试在我的Linux机器上,因为我专注于试图让它工作。

这里是简化的testing代码,不能按预期工作(提醒这是用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()

希望有人能够阐明这是否是预期的function,如果我没有正确实施,或者其他一些有用的信息。

谢谢。

为什么在Windows上启动新进程时,Python的多进程模块会导入__main__?

我怎样才能从孩子的过程中获得价值?

Windows多处理

使用Python 3.6.1在Linux / Intel Xeon上使用“fork”上下文块进行多处理?

为什么使用sigprocmask来阻止SIGCHLD在下面的代码中传递

当你看看Pythons的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)来解决这个问题:

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

和“ 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] 举报,一经查实,本站将立刻删除。

相关推荐