#selenium #jupyter-notebook #multiprocessing #calculation
#selenium #jupyter-notebook #многопроцессорная обработка #вычисление
Вопрос:
Я пытаюсь одновременно запускать несколько функций в записной книжке Jupiter.
У меня есть две функции очистки веб-страниц, которые используют Selenium и выполняются бесконечно долго, и обе всегда создают обновленный фрейм данных. Другая функция объединяет два фрейма данных и выполняет некоторые вычисления.
Поскольку данные всегда меняются, а вычисления из разных фреймов данных необходимо вычислять в течение одной секунды (два фрейма данных обновляются каждые 5 секунд), мне интересно, как я могу запускать все функции одновременно.
Поскольку мой код в основном используется для создания веб-страниц, я использовал это больше, чтобы описать свою цель и, надеюсь, сделать ее более читаемой. Я уже пробовал использовать «многопроцессорную обработку», но она просто ничего не делает в записной книжке.
def FirstWebScraping():
while True:
time.sleep(5).
#getting all data for DataFrame
def SecondtWebScraping():
while True:
time.sleep(5).
#getting all data for DataFrame
def Calculations():
while True:
#merging DataFrame from First- and SecondWebScraping
#doing calculations
#running this function infinite and looking for specific values
#Goal
def run_all_at_the_same_time()
FirstWebScraping()
SecondWebScraping()
Calculations()
Ответ №1:
Несмотря на то, что многопоточность не дает тех же преимуществ, что и многопроцессорная обработка, она работала у меня и с selenium. Я установил время ожидания в начале для функции вычислений, и оттуда все они были бесконечно повторены.
from threading import Thread
if __name__ == '__main__':
Thread(target = FirstWebScraping).start()
Thread(target = SecondWebscraping).start()
Thread(target = Calculations).start()
Ответ №2:
Вы можете запускать multiprocessing
в Jupyter, если будете следовать двум правилам:
- Поместите рабочие функции в отдельный модуль.
- Защитите код только для основного процесса с помощью
if __name__ == '__main__':
Предполагая, что ваши три функции перемещены в worker.py
:
import multiprocessing as mp
import worker
if __name__ == '__main__':
mp.Process(target=worker.FirstWebScraping).start()
mp.Process(target=worker.SecondWebscraping).start()
mp.Process(target=worker.Calculations).start()
Комментарии:
1. Worker.function может решить проблему, однако, когда я хочу импортировать worker, я получаю: ModuleNotFoundError: нет модуля с именем ‘worker’
2. @Felix Вы должны создать
worker.py
и поместить его в рабочий каталог Jupyter.os.getcwd()
расскажет вам, где это.