7

マルチスレッドの SMTP サーバーを使用しています。各スレッドは 1 つのクライアントを処理します。各サーバー スレッドに 10 秒のタイムアウト値を設定して、休止状態のクライアントや不正な動作をしているクライアントを終了する必要があります。
を使用してtime.time()、開始時刻とチェックポイント時刻を見つけましたが、その差が実行時間を示しています。しかし、このスレッドが実行されていた時間ではなく、システム時間が提供されると思います。
Python にスレッド ローカル タイマー API はありますか?

   import threading
   stop = 0

   def hello():
     stop = 1

   t=threading.Timer(10,hello)
   t.start()
   while stop != 1:
      print stop
   print "stop changed"

これは、ループ内で 0 (初期停止) を出力し、while ループから抜け出しません。

4

5 に答える 5

7

Pythonのドキュメントには、「スレッドタイミング」についての言及はありません。クロックはプロセス全体またはシステム全体です。特に、システム時間を返しtime.clockながら処理時間を測定します。time.time

python3.3 では、タイミング API が改訂および改善されましたが、それでも、単一のスレッドが処理した時間を返すタイマーは見当たりません。

また、可能であったとしても、そのようなタイマーを作成するのはまったく簡単ではないことに注意してください。タイマーは OS 固有であるため、OS ごとに異なるバージョンのモジュールを作成する必要があります。特定のアクションをプロファイリングしたい場合は、スレッドなしで起動してください。タイミングをスレッド化すると、期待どおりに実行されるか、OS が原因ではるかに遅くなります。その場合、何もできません (少なくとも、「修正」するパッチを書きたくない場合)。 GIL を削除するか、安全に削除します)。

于 2012-11-18T19:53:22.157 に答える
6

Python 3.7 は、time.thread_time()この質問が必要とすることを行うと思われるメソッドを追加しました。docsによると、それはスレッド固有であり、睡眠に費やされた時間を除外します。

于 2019-07-25T14:04:24.393 に答える
2

hello関数の停止値はローカルであり、グローバルではありません。

以下を追加します。

def hello():
   global stop
   stop = 1
于 2012-11-18T18:44:26.890 に答える