私はthreads
リストを維持しており、スレッドが終了したらリストからスレッドを自動削除したいと思います。
私はこの方法を見つけました:
import threading, time
def f(seconds, info):
print('starting', seconds)
time.sleep(seconds)
print('finished', seconds)
threads.remove(info['thread'])
def newaction(seconds):
info = {}
thread = threading.Thread(target=f, args=(seconds, info))
info['thread'] = thread
thread.start()
threads.append(thread)
threads = []
newaction(1)
newaction(2)
for _ in range(10):
time.sleep(0.3)
print(threads)
できます:
starting 1
starting 2
[<Thread(Thread-1, started 1612)>, <Thread(Thread-2, started 712)>]
[<Thread(Thread-1, started 1612)>, <Thread(Thread-2, started 712)>]
[<Thread(Thread-1, started 1612)>, <Thread(Thread-2, started 712)>]
finished 1
[<Thread(Thread-2, started 712)>]
[<Thread(Thread-2, started 712)>]
[<Thread(Thread-2, started 712)>]
finished 2
[]
[]
[]
[]
しかし、dict info
を渡す必要があるという事実は少しハックです。明らかにthread
をargs
に渡すことができないため、これを使用しました...
thread = threading.Thread(target=f, args=(seconds, thread))
# ^ not created yet!
...Thread
オブジェクトがまだ作成されていない場合!
Pythonで自動クリーニング可能なスレッドのリストを維持するためのより自然な方法はありますか?
_import threading
def get_status_of_threads():
current_threads = threading.enumerate()
thread_data = []
for item in current_threads:
try:
print(str(item.target))
except AttributeError:
print("item", str(item))
thread_data.append({"thread_name": item.getName(), "status": int(item.is_alive()), "id": item.ident})
return thread_data
_
上記のコードはPython2.7でテストされています。スレッドを継続的に監視する場合は別のスレッドで使用できます。または、これをAPIとして公開して、いつでも確認できます。これは、同じリソースの無駄を減らすのにも役立ちます。
APIの場合、json2html.convert({"thread_data":thread_data})
関数を使用して、より美的な方法で表形式で表示できます。