Я работаю над программой PyQt, которая в основном собирает данные из Интернета. В этом примере я пытаюсь получить данные с веб-страницы RSS.
Предположим, что self.feed — это страница RSS, содержащая все статьи, а «запись» — это статья. «entry.url» — это исходная страница статьи на веб-сайте.
from requests_futures.sessions import FuturesSession
self.session_pages = FuturesSession(max_workers=20)
for entry in self.feed.entries:
future = self.session_pages.get(entry.url, timeout=10)
future.add_done_callback(my_call_back)
Я в основном так и делаю. Он встроен в поток PyQt, и я одновременно запускаю несколько потоков, но я думаю, что проблема не в PyQt.
Моя проблема в том, что я думаю, что фьючерсы не закрывают соединение, даже когда они сделаны. Проверяю так:
lsof -i | grep "python" | wc -l
losf -i дает открытые файлы, участвующие в соединении. Остальная часть команды предназначена для подсчета количества открытых файлов. Это число не перестает расти (что-то вроде 900), и тогда я получаю следующую ошибку:
(python:28285): GLib-ERROR **: Creating pipes for GWakeup: Too many open files
[1] 28285 trace trap (core dumped) python gui.py
Я думаю, что проблема связана с фьючерсами, но на самом деле я не уверен.
Я пробовал что-то вроде:
self.session_pages.shutdown()
в конце темы, но это не сработало.
Есть ли у вас какие-либо идеи ?
lsof -i | grep "python" | wc -l
? - person user3661992   schedule 19.08.2020