我的代码是否会扩散线程?

时间:2017-12-12 17:55:26

标签: python multithreading

我是Python和多线程的新手。我读到一个Python线程在它运行的函数'return'时完成。我是否应该担心我的程序会激活无限量的线程?

我问,因为有时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 个答案:

答案 0 :(得分:1)

嗯,让我们从一个稍微不同的角度来处理这个问题。

简单地说,Thread pools允许您为请求分配一个具有最多工作者数的池。这意味着您可以指定用于异步任务的线程数的上限。因此,通过稍微改变创建/运行线程的方式可以部分缓解您的担忧。

我建议将线程池作为学习线程的下一步。

这是一个有用的链接:

Threading pool similar to the multiprocessing Pool?

至于你是否有43个以上的线程同时运行,我不知道我们有足够的关于你的代码的信息。您需要进行一些调试以评估在给定时间有多少线程处于活动状态,以及是否有任何遇到异常的内容仍然存在于内存中,保留资源或被其他资源保留。 IIRC,线程ID #s 可能被回收。