在一个多线程的跨平台python3.3应用程序上,我遇到了一些我不期待的奇怪的行为,我不确定是预期的。问题是Windows 8调用一个线程中的input()方法阻止其他线程,直到它完成。我已经在三个Linux,两个Windows 7和一个Windows 8计算机上测试了下面的示例脚本,这种行为只在Windows 8计算机上观察到。这是Windows 8的预期行为吗?
原文链接:https://www.f2er.com/windows/372748.htmltest.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',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)
更新:
在尝试其中一个建议时,我意识到我赶上了一个结论,缺少一些明显的东西。对于开始虚假的开始,我深表歉意。
由于Schollii建议只使用线程(没有子进程或python文件)导致所有线程前进,所以问题实际上是在一个python进程中使用input()将导致其他python进程阻止/不运行(我不知道什么正在进行)。此外,它似乎只是受影响的python进程。如果我使用上面显示的相同代码(通过一些修改)来执行具有subprocess.Popen的非python可执行文件,它们将按预期运行。
总结:
>使用子进程来执行非python可执行文件:按预期方式工作,并且没有对input()的任何调用。
>使用子进程执行python可执行文件:如果在原始进程中调用input(),则已创建的进程似乎不会运行。
>使用子进程在新进程中调用input()而不是原始进程来创建python进程:对input()的调用将阻止“main”进程产生的所有python进程。
侧面注意:我没有Windows 8平台,所以调试/测试可能会有点慢。