Что делать, если Selenium в тасках Celery подвисает и блокирует работу всего Селери?

Использую Celery, Celery beat, Redis, Python, Selenium В тасках селери идут обращения к разным сайтам через Selenium и получение информации с них. По расписанию каждую минуту.

Иногда на сайтах не находится элемент или он не грузится или еще что. Это все в итоге рано или поздно приводит к зависанию Селери и неработе приложения. Что мне делать и как отделить каждый таск от влияния на приложение? Мол если проблема или подвисание, таск убивается и это никак не влияет на работу приложения и селери.

Пробовал такое https://selenium-python.readthedocs.io/waits.html#explicit-waits

Результат становится чуть получше, но все равно возникает подвисание рано или поздно и все, ребут сервера нужен. В консоли вижу такое, нереальное время исполнения тасков более 10 сек и в итоге потом подвисание.

 [2021-01-29 20:59:43,903: INFO/ForkPoolWorker-1] Task tasks.btc_hashrate_vs_price[a79dae51-b5b6-42c3-8653-eb3db594a6d9] succeeded in 285.46829061600147s: None
[2021-01-29 20:59:45,813: INFO/MainProcess] Received task: tasks.btc_rsi[f2395a63-885e-4339-954e-f5aa7b7488c3]  
[2021-01-29 21:04:13,102: ERROR/ForkPoolWorker-1] Message: unknown error: DevToolsActivePort file doesn't exist

[2021-01-29 21:04:15,840: INFO/ForkPoolWorker-1] Task tasks.btc_predict_cycle[11eb2199-0445-4fea-9916-d303a2a93643] succeeded in 271.53123419199255s: None
[2021-01-29 21:07:28,399: INFO/MainProcess] Received task: tasks.fear_greed_index[4ecb533e-c758-4c47-b1bc-2ba13e475861]  
[2021-01-29 21:08:44,493: ERROR/ForkPoolWorker-1] Message: Can not connect to the Service chromedriver

[2021-01-29 21:08:46,465: INFO/ForkPoolWorker-1] Task tasks.btc_gold[63bb0013-f2c8-4876-9aa8-ca14ec1e8ebd] succeeded in 119.68898677200195s: None
[2021-01-29 21:09:06,504: INFO/MainProcess] Received task: tasks.btc_liquidation_exchanges[4286d9b4-4434-4149-8443-c7370a66e587]  
[2021-01-29 21:12:41,417: ERROR/ForkPoolWorker-1] Message: chrome not reachable

[2021-01-29 21:12:41,475: INFO/ForkPoolWorker-1] Task tasks.flow[f996df4e-39d3-4532-8d5c-f14de52c3280] succeeded in 233.68906934201368s: None
[2021-01-29 21:12:43,482: INFO/MainProcess] Received task: tasks.btc_yearly_candles[7227518e-06ce-41b6-b899-b10dd4bccc15]  
[2021-01-29 21:13:51,900: ERROR/ForkPoolWorker-1] Message: chrome not reachable

[2021-01-29 21:13:51,930: INFO/ForkPoolWorker-1] Task tasks.btc_wallets[0eb8e537-34b8-4512-a589-71658f91129e] succeeded in 70.32356584700756s: None
[2021-01-29 21:13:52,121: INFO/MainProcess] Received task: tasks.btc_hashrate_vs_price[2d7f3f1a-07a4-4fc4-a33c-6fe381baf9ca] 

И все... после такого лога сервер подвис с концами. Это были последние строки работы.

И time limit на таск пробовал. Ставил 20 сек и как только какой-то таск вылетал с ошибкой тайм-аута, остальные так же начинали об него спотыкаться и в итоге везде таймауты и подвисание сервера.

tasks.py

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    """
    Запускает периодические задачи с интервалом в указанное количество секунд.
    """
    sender.add_periodic_task(60.0, flow.s(), name='flow')
    sender.add_periodic_task(61.0, btc_wallets.s(), name='btc_wallets')
    sender.add_periodic_task(62.0, btc_rsi.s(), name='btc_rsi')


@app.task
def flow():
    try:
        get_screen_btc("flow")
    except Exception as err:
        logging.error(err)


@app.task
def btc_wallets():
    try:
        get_screen_btc("btc_wallets")
    except Exception as err:
        logging.error(err)


@app.task
def btc_rsi():
    try:
        get_screen_btc("btc_rsi")
    except Exception as err:
        logging.error(err)

screen.py

def set_chrome_options() -> None:
    """Sets chrome options for Selenium.
    Chrome options for headless browser is enabled.
    """
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_prefs = {}
    chrome_options.experimental_options["prefs"] = chrome_prefs
    chrome_prefs["profile.default_content_settings"] = {"images": 2}
    return chrome_options


def get_screen_btc(chart):
    driver = webdriver.Chrome(options=set_chrome_options())
    urls = {
        'flow': 'https://cryptoquant.com/sign-in',
        'btc_wallets': 'https://coinmarketcap.com/bitcoin-analytics/',
        'btc_rsi': 'https://digitalik.net/btc/rsi',
    }
    URL = urls[chart]
    driver.get(URL)
    driver.set_window_size(1920, 1080)

    try:
        element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located(
        (By.CLASS_NAME, "row"))
        )
        element.screenshot(f'{chart}.png')
   finally:
        logging.error('элемент не нашли!')
            

В коде выше я показал лишь три таска, но у меня их около 30.

Отсюда и вопрос, как решить проблему, как обуздать работу каждого таскан независимо от сервера и селении, чтобы подвисание одного не влияло на другие и подвисший перезапускался потом по очереди? Спасибо


Ответы (0 шт):