我是 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/