0

私が直面しているこの問題に対して、誰かが迅速かつ簡単に解決できることを願っています。MarkLutzによるProgrammingPythonの本の第4版の第5章を読んでいますが、189ページから問題が発生しています。基本的に、非常に簡単な例があります。

import _thread
def action(i):
    print(i ** 32)

_thread.start_new_thread(action, (2, ))

何らかの理由で、このスクリプトはUbuntu 12.04を実行しているPCでは出力を生成しませんが、Windows7マシンでは生成します。端末から実行した場合の出力は次のとおりです。

un@homepc:~/Desktop/pp$ python3.2 thread1.py
un@homepc:~/Desktop/pp$ 

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

0

私はスレッドの専門家ではありませんが、これが問題である可能性が最も高いです。

このコードを実行する場合、Pythonは最後の行の後で何もする必要がないため、スレッドを強制的に終了して終了します(完了したかどうかは関係ありません)。スレッドの実行方法に応じて、スレッドが完了する場合と完了しない場合があります。(信頼できない動作)

メインスレッドの擬似コード命令:

新しいスレッドを作成します

新しいスレッド:

action(2)

メインスレッドの次の命令:

プログラムが終了しました;終了

修正されたコード:

import _thread
def action(i):
    print(i ** 32)
    action_lock.release() #Now Python will exit

#locks are a part of threaded programming; if you don't know what it is, you can google it.
action_lock = _thread.allocate_lock() #set a lock for the action function thread
action_lock.acquire() #Acquire the lock
_thread.start_new_thread(action, (2, ))
action_lock.acquire()
于 2012-08-21T14:49:29.877 に答える
0

私を正しい方向に向けてくれたRamchandraに感謝します。問題は、プログラムが終了してスレッドを強制終了していたことでした。これを実行すると:

import time, _thread

def print_t(name, delay):
    while True:
        try:
            time.sleep(delay)
            print(name)
        except: pass

_thread.start_new_thread(print_t, ("First Thread", 1,))
_thread.start_new_thread(print_t, ("Second Thread", 2,))

while True:
    try: pass
    except KeyboardInterrupt:
        print("Ending main program")
        break

...その後、プログラムは計画どおりに実行されます。元の投稿のコードがWindows7で機能したのに、ubuntu12.04では機能しなかった理由については答えがありません。しかたがない。これがいつか誰かに役立つことを願っています。

于 2012-08-22T04:11:01.337 に答える