2017-10-09 5 views
1

スレッドを使用して無期限に実行し、数秒ごとにいくつかのものをdbに入れるスクリプトを作成しています。これはうまくいきますが、プロセスのメモリは数秒ごとに少しずつ増加しています。これは、すべてのスレッドオブジェクトを保持するリストが決して空にならないためです。どうすればいい? ジョインはis_alive条件のもとに置かれるため、次のスレッドを生成するまでに時間がかかりません。python3リストからスレッドオブジェクトを削除する方法

AttributeError: 'Thread' object has no attribute 'kill'

import threading 
import time 

def dicthing(dic, x): 
    dic.update({x: x*x}) 
    time.sleep(0.01) 

dic = {} 
threads = [] 
x = 100 
while x > 0: 
    t = threading.Thread(target = dicthing, args = (dic, x)) 
    threads.append(t) 
    t.start() 
    x -= 1 

    if x % 50 == 0: 
     print(len(threads), len(threading.enumerate())) 

    for t in threads: 
     if t.is_alive() == False: 
      t.join() 
      t.kill = True 
    threads = [t for t in threads if not t.kill] 

で以下の例の結果は、Iであることを出力したい:

1 1

1 1

+0

whileループに参加しませんか? –

+0

ループやリストの理解を使用してもはや存在しないスレッドをフィルタリングする –

+1

「x」ごとに新しいスレッドを作成するのではなく、スレッドの固定プール(ThreadPool)を作成し、それらの間で作業を共有することができます。 – 101

答えて

0

最終行(for - ループとに)書き込むことができるいずれかの簡単として:

threads_alive = [] 
    for t in threads: 
     if t.is_alive() == False: 
      t.join() 
     else: 
      threads_alive.append(t) 

    threads = threads_alive 

すでに死んでいるスレッドを何らかの形でまだ処理していなければならない場合:

threads_alive = [] 
    threads_dead = [] 
    for t in threads: 
     if t.is_alive() == False: 
      t.join() 
      threads_dead.append(t) 
     else: 
      threads_alive.append(t) 

    threads = threads_alive 
    for t in threads_dead: 
     ... postprocess dead threads here ... 
+0

私はリストから削除するために必要なので、列挙型でインデックスでデッドスレッドを格納しましたが、私のソリューションは多かれ少なかれ同じでした。ありがとう! – r0edie

関連する問題