input()阻止Windows 8中的其他python进程(python 3.3)

red*_*maw 18 python windows multithreading input python-3.x

在一个多线程的跨平台python3.3应用程序上工作我遇到了一些我没想到的奇怪行为,并且我不确定是否可以预期.问题出在Windows 8上,input()在一个线程中调用该方法会阻塞其他线程,直到完成为止.我在三台Linux,两台Windows 7和一台Windows 8计算机上测试了下面的示例脚本,这种行为仅在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')
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

更新:在尝试其中一个建议时,我意识到我匆匆得出结论,遗漏了一些明显的东西.我为开始一个错误的开始而道歉.

正如Schollii建议只使用线程(没有子进程或python文件)会导致所有线程前进,所以实际上input()在一个python进程中使用的问题会导致其他python进程阻塞/不运行(我不确切知道发生了什么).此外,它似乎只是受影响的python进程.如果我使用上面显示的相同代码(经过一些修改)来使用subprocess.Popen执行非python可执行文件,它们将按预期运行.

总结一下:

  • 使用子进程执行非python可执行文件:在有和没有任何调用的情况下按预期工作input().
  • 使用子进程执行python可执行文件:如果input()在原始进程中进行了调用,则创建的进程似乎不会运行.
  • 使用subprocess通过调用input()新进程而不是原始进程来创建python进程:调用input()阻止'main'进程生成的所有python进程.

旁注:我没有Windows 8平台,所以调试/测试可能有点慢.

小智 1

因为Python 3.0-3.2input中存在几个问题该方法受到了影响,几乎没有进行任何更改。

我们可能又遇到了新的错误。

您可以尝试以下变体,即“向后端口”(在Python 2.xraw_input()中可用):

...
i = eval(input("-->"))
...
Run Code Online (Sandbox Code Playgroud)

  • 我认为这与问题无关。首先,您将展示与 Python 3.x 一起使用的 Python 2.x 的“input()”的等效项,而不是“raw_input()”向后移植。Python 3 的“input()”*是*Python 2 的“raw_input()”(或多或少)。其次,将阻塞函数包装在另一个调用中如何阻止它阻塞? (4认同)