1

非常に単純な例があります。名前が出力されますが、問題は、ctrl + C を押しても、プログラムが通常のコマンド ライン インターフェイスに戻らないことです。

^CStopping 

カーソルが点滅するだけで何もできないので、ウィンドウを閉じてもう一度開く必要があります。Ubuntu 12.10 を実行しています。

それは私のコードです:

import threading
import random
import time
import Queue
import urllib2
import sys

queue = Queue.Queue()
keep_running = True

class MyThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.names = ['Sophia', 'Irina', 'Tanya', 'Cait', 'Jess']

    def run(self):
        while keep_running:
            time.sleep(0.25)
            line = self.names[random.randint(0,len(self.names)-1)]
            queue.put(line)
            self.queue.task_done()

class Starter():
    def __init__(self):
        self.queue = queue
        t = MyThread(self.queue)
        t.start()
        self.next()

    def next(self):
        while True:
            time.sleep(0.2)
            if not self.queue.empty():
                line = self.queue.get()
                print line, self.queue.qsize()
            else:
                print 'waiting for queue'

def main():  
    try:
        Starter()     
        queue.join()
    except KeyboardInterrupt, e:
        print 'Stopping'
        keep_running = False
        sys.exit(1)

main()
4

2 に答える 2

3

あなたの主な問題は、keep_runningas として宣言しなかったglobalためmain、同じ名前のローカル変数を作成しているだけです。

それを修正すると、通常、一部のプラットフォームで終了します。

すべてのプラットフォームで常に終了するようにするには、さらに 2 つのことを行う必要があります。

  1. joinあなたが作成したスレッド。
  2. Lockまたは他の同期メカニズムで共有グローバル変数を保護します。

ただし、ここでは共有グローバルkeep_runningフラグは実際には必要ありません。あなたはすでに持っていqueueます。キューに投稿できる特別な「シャットダウン」メッセージを定義するか、キューを閉じることをシャットダウンの合図として使用するだけです。

遅いネットワークなどをシミュレートしようとしている場合を除きtime.sleep、コードでそれを行う必要はありません。呼び出すだけself.queue.get(timeout=0.2)です。そうすれば、各エントリを取得するのに常に 0.2 秒かかるのではなく、最大で0.2 秒かかりますが、既に何かがある場合はわずか 0 秒です。

于 2013-04-24T19:16:35.337 に答える
1

あなたのメイン スレッドは でスタックしていStarter.nextます。次に、割り込みがそこで呼び出され、tryステートメントの最初の行まで伝播してキャッチされ、exceptjoin を呼び出す前に句にジャンプします。join呼び出しを finally ブロック (を使用sys.exit) に入れるか、単純に例外ハンドラーに移動してみてください

于 2013-04-24T19:27:23.550 に答える