我是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)
答案 0 :(得分:1)
简单地说,Thread pools允许您为请求分配一个具有最多工作者数的池。这意味着您可以指定用于异步任务的线程数的上限。因此,通过稍微改变创建/运行线程的方式可以部分缓解您的担忧。
我建议将线程池作为学习线程的下一步。
这是一个有用的链接:
Threading pool similar to the multiprocessing Pool?
至于你是否有43个以上的线程同时运行,我不知道我们有足够的关于你的代码的信息。您需要进行一些调试以评估在给定时间有多少线程处于活动状态,以及是否有任何遇到异常的内容仍然存在于内存中,保留资源或被其他资源保留。 IIRC,线程ID #s 可能被回收。