web-dev-qa-db-ja.com

Pythonでスレッドの自動クリーニング可能なリストを維持します

私は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を渡す必要があるという事実は少しハックです。明らかにthreadargsに渡すことができないため、これを使用しました...

thread = threading.Thread(target=f, args=(seconds, thread))  
#                                                     ^ not created yet!

...Threadオブジェクトがまだ作成されていない場合!

Pythonで自動クリーニング可能なスレッドのリストを維持するためのより自然な方法はありますか?

4
Basj
_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})関数を使用して、より美的な方法で表形式で表示できます。

0