2017-12-12 4 views
2

私はPythonとマルチスレッドの両方に新しいです。 Pythonスレッドは、実行中の関数が '返す'ときに終了します。私のプログラムが無限のスレッドを回転させているのではないかと心配すべきですか?私のコードはスレッドを繁殖させますか?

ため、私は時々、HTTPリクエストがタイムアウト尋ねることだし、それは(予想)のエラーがスローされます。

Exception in Thread-44

エラーが私の心配ではなく、スレッドの数です。これは実際に44のスレッドがあることを意味しますか、これは単純に44番目のスレッドです(ただし、前の43は優雅に閉じられています)。

コード:

def start(self, error_refresh=None): 
    self.timeout_id = GLib.timeout_add_seconds(10, self.check_price) 

def stop(self): 
    if self.timeout_id not 0: 
    GLib.source_remove(self.timeout_id) 

def check_price(self): 
    self.async_get(URL, callback=self._parse_result) 
    return True 

def async_get(self, *args, callback=None, timeout=15, **kwargs): 
    if callback: 
     def callback_with_args(response, *args, **kwargs): 
      callback(response) 
     kwargs['hooks'] = {'response': callback_with_args} 
    kwargs['timeout'] = timeout 
    thread = Thread(target=requests.get, args=args, kwargs=kwargs) 
    thread.start() 

def _parse_result(self, data): 
    ## code for parsing here 
    GLib.idle_add(self.indicator.set_data,label, bid, high, low, ask, vol) 

答えて

1

うーん、のは、わずかに異なる角度からの質問にアプローチしましょう。

簡単に言えば、Thread poolsは、要求に対して最大数のワーカーをプールに割り当てることができます。つまり、非同期タスクに使用されているスレッド数の上限を指定できます。したがって、スレッドを作成/実行する方法を少し変更するだけで、あなたの懸念が部分的に緩和される可能性があります。

スレッドの学習の次のステップとしてスレッドプールを調べることをおすすめします。

がここに便利なリンクです:あなたが同時に実行43+スレッドを持っているかどうか、または-ないよう

Threading pool similar to the multiprocessing Pool?

、私たちはあなたのコードに関する十分な情報を持っていることを知りません。ある時点でいくつのスレッドがアクティブであるかを評価したり、例外が発生したものがメモリに残っていたり、リソースを保持したり、他のリソースによって保持されている場合は、デバッグを行う必要があります。 IIRC、スレッドID番号はリサイクルできます。

+0

ありがとう、これは将来のコードの最適化に役立ちます。これまでに実行されているスレッドの数を示す関数が見つかりました。一度に4つしかないとは限りませんが、スレッドがまだタイムアウトに達していないのにタイマが既に別のスレッドをスピンアップしている場合、その数を超えることがあります。私はリフレッシュ間隔にもタイムアウトを設定することができました。とにかく私は8を超えることはありませんでした。つまり、スレッドは正しく終了していて、番号は単なるIDですが、実行中のスレッドの数は示されていません。 – bluppfisk

+0

最も優れています!あなたのスレッドをID /カウントする方法を見つけられたらうれしいです。解決策を見いだすための帽子: – bedwyr

+0

:Dまた、完全性のために、関数はthreading.active_count()です。 – bluppfisk

関連する問題