Как отключить функцию при применении к столбцу данных без сигнала - PullRequest
0 голосов
/ 18 октября 2019

Я применяю функцию к столбцу данных и сохраняю результат в новом столбце. Я пытаюсь сделать это в среде Jupyter Notebook.

import pandas as pd

import requests
from requests import get
from requests.exceptions import RequestException, ConnectionError

df = pd.DataFrame({'url': ["https://www.microsoft.com", "https://www.zalando.com"]})

def get_body(url):
    try:
        r = get(url)
        status_code = r.status_code
        accepted_status_code = [200]
        if status_code in accepted_status_code:
            body = r.text
        else:
            body = None
        return body
    except (ConnectionError, RequestException, UnicodeError) as e:
        return None

df["body"] = df["url"].apply(get_body)

Это прекрасно работает для большинства строк, но для некоторых применение функции занимает слишком много времени.

В примеревыше: когда df содержит только URL-адрес Microsoft, все в порядке, но когда добавлен URL-адрес Заландо, df. Функции киосков.

Итак, я хотел бы сделать следующее: пропустить применение функции строки, в которой функция останавливается после, скажем, 3 секунды, и перейти к следующей строке.

I 'Мы уже опробовали подход Signal из этого вопроса: Убить функцию питона через заданный промежуток времени , но это приводит к проблеме с ядром в Jupyter Notebook.

При использовании многопроцессорного подхода из того жеответ, это приводит к двум проблемам:

  • во-первых: он не работает должным образом, он продолжает работать, он не завершается через 3 секунды
  • во-вторых: Iне знаю, как сохранить результаты в новом столбце DataFrame. (Я не могу сказать что-то вроде: target = df["body"] = df["url"].apply(get_body). Двойные = -марки после цели, конечно, не принимаются.
import multiprocessing

if __name__ == '__main__':
    # Start get_status_code_and_body as a process
    p = multiprocessing.Process(target= df["url"].apply(get_body))
    p.start()

    # Wait for 3 seconds or until process finishes
    p.join(3)

    # If thread is still active
    if p.is_alive():
        print("running... let's kill it...")

        # Terminate
        p.terminate()
        p.join()

Что я могу сделать, чтобы это сработало?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...