python - 我的代码会增加线程吗?

标签 python multithreading

我是 Python 和多线程的新手。我读到 Python 线程在运行的函数“返回”时完成。我是否应该担心我的程序会产生无限数量的线程?

我问是因为有时 HTTP 请求会超时并引发(预期的)错误:

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)

最佳答案

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

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

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

这是一个有用的链接:

Threading pool similar to the multiprocessing Pool?

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

关于python - 我的代码会增加线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47778761/

相关文章:

python - pandas 数据框的每日气候学

python - 如何在numpy数组中查找切片对象

java - 我可以获取生成当前线程的类和方法的名称吗?

java - Java是否内置了 "reversed"SwingWorker

python - 处理列表给出错误 "list indices must be integers or slices, not tuple"

python - 让我的 python c++ 扩展在 Windows 上使用 Swig 和 Distutils 进行编译

python - 将日期时间传递给 psycopg2

c# - C# 的并行编程模式?

c++ - openMP 的目标和目标数据之间的区别?

javascript - 获取服务器上的所有 Discord 线程 (Discord.js)