Я применяю функцию к столбцу данных и сохраняю результат в новом столбце. Я пытаюсь сделать это в среде 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()
Что я могу сделать, чтобы это сработало?