似乎IDLE(标准Python Windows安装的一部分)在没有令人讨厌的挂起或错误崩溃的情况下不会正确执行多线程程序。有谁知道解决这个问题的方法?
以下程序将始终挂在IDLE中,但在使用Python解释器直接执行时正常完成:
import threading, time
printLock = threading.Lock()
def pl(s):
printLock.acquire()
print s
printLock.release()
class myThread( threading.Thread ):
def run(self):
i = 0
for i in range(0,30):
pl(i)
time.sleep(0.1)
t = myThread()
t.start()
while threading.activeCount() > 1:
time.sleep(1)
pl( time.time() )
print "all done!"
示例输出:
U:\dev\py\multithreadtest>python mt.py
0
1
2
3
4
5
6
7
8
9
1277935368.84
10
11
12
13
14
15
16
17
18
19
1277935369.84
20
21
22
23
24
25
26
27
28
29
1277935370.84
1277935371.84
all done!
使用IDLE时的输出“运行模块”功能始终在我的机器上显示23或24行读数时无限期挂起。
答案 0 :(得分:2)
import threading
print(threading.activeCount())
在命令行运行时打印1,从空闲运行时打印2。所以你的循环
while threading.activeCount() > 1:
time.sleep(1)
pl( time.time() )
将在控制台中终止,但永远在空闲状态下继续。
要解决已发布代码中的问题,请添加类似
的内容initial_threads = threading.activeCount()
导入后并将循环标题更改为
while threading.activeCount() > initial_threads:
通过此更改,代码将运行30个周期,并在完成所有操作后停止!'。我已将此添加到我需要记录的控制台Python与空闲差异列表中。
答案 1 :(得分:0)
AFAIK在IDLE中运行线程代码时,这是一个废话。 IDLE大量使用GIL,因此竞争条件和死锁很常见。不幸的是,我并没有足够精通线程来提供有关使这个线程安全的见解,超越显而易见的。
答案 2 :(得分:0)
IDLE在线程方面存在一些已知问题。我不知道为什么这个问题的详细信息,因为我努力远离IDLE,但我知道它是。我强烈建议你去Visual Studio获取IronPython和Python工具。 VS的调试工具绝对是无与伦比的,特别是考虑到庞大的附加组件库。