7

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の行が私のマシンに表示される頃に常に無期限にハングします。

4

3 に答える 3

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とアイドルの違いのリストにこれを追加しました。

于 2015-03-29T22:53:30.250 に答える
0

IDLEには、スレッド化に関していくつかの既知の問題があります。IDLEに近づかないように一生懸命頑張っているので、なぜそれが問題になるのか、その詳細については圧倒的な量はわかりませんが、そうだとは思います。VisualStudio用のIronPythonとPythonToolsを入手することを強くお勧めします。VSのデバッグツールは、特にアドオンの膨大なライブラリを考えると、絶対に比類のないものです。

于 2012-08-23T15:58:54.540 に答える
0

IDLEでスレッドコードを実行するときのクラップスです。IDLEはGILを自由に使用するため、競合状態とデッドロックが一般的です。残念ながら、私はスレッド化に精通していないため、明らかなことを超えて、このスレッドセーフにするための洞察を提供できません。

于 2010-07-01T00:39:02.170 に答える