У меня есть список 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 поддерживать автоматически очищаемый список потоков?