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可执行文件,它们将按预期运行.
总结一下:
input()
.input()
在原始进程中进行了调用,则创建的进程似乎不会运行.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)
归档时间: |
|
查看次数: |
1311 次 |
最近记录: |