在一个multithreading的跨平台python3.3应用程序上工作,我遇到了一些奇怪的行为,我没有料到,也没有把握。 问题是在Windows 8中调用一个线程中的input()
方法阻塞其他线程,直到完成。 我已经在三台Linux,两台Windows 7和一台Windows 8计算机上testing了下面的示例脚本,而且这种行为只能在Windows 8计算机上观察到。 这是Windows 8的预期行为?
test.py:
import subprocess, threading, time def ui(): i = input("-->") print(i) def loop(): i = 0 f = 'sky.{}'.format(i) p = subprocess.Popen(['python', 'copy.py', 'sky1', f]) t = time.time() while time.time() < t+15: if p.poll() != None: print(i) time.sleep(3) i+=1 f = 'sky.{}'.format(i) p = subprocess.Popen(['python', 'copy.py', 'sky1', f]) p.terminate() p.wait() def start(): t1 = threading.Thread(target=ui) t2 = threading.Thread(target=loop) t1.start() t2.start() return t2 t2 = start() t2.join() print('done')
copy.py:
import shutil import sys src = sys.argv[1] dst = sys.argv[2] print('Copying \'{0}\' to \'{1}\''.format(src, dst)) shutil.copy(src, dst)
更新:在尝试其中一个build议的时候,我意识到我冲到了一个明显的东西丢失的结论。 我为错误的起步道歉。
由于Scholliibuild议使用线程(没有subprocess或python文件)导致所有线程正在进展,所以问题实际上是在一个python进程中使用input()
将导致其他python进程阻止/不运行(我不知道究竟是什么正在进行)。 此外,它似乎只是受影响的Python进程。 如果我使用上面显示的相同的代码(有一些修改)来执行非python可执行文件和subprocess.Popen,它们将按预期方式运行。
总结:
input()
。 input()
则创build的进程似乎不会运行。 input()
而不是原始进程来创buildpython进程:调用input()
阻止由“main”进程产生的所有python进程。 边注:我没有Windows 8平台,所以debugging/testing可能会有点慢。
由于在Python 3.0-3.2中 input
有几个问题,这个方法已经受到影响,几乎没有变化。
有可能我们又有一个新的bug。
你可以尝试下面的变种,它是raw_input()
“back port”(在Python 2.x中可用):
... i = eval(input("-->")) ...
与之合作是一个非常好的问题,
因为你依赖于input()
方法,它通常需要控制台输入,
既然你有线程,所有的线程都试图与控制台通信,
所以,我建议你使用Producer-Consumer
概念,或者把所有的输入定义到一个文本文件中,然后把文本文件传给程序。