Как синхронно запускать несколько функций в Jupyter Notebook?

#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, если будете следовать двум правилам:

  1. Поместите рабочие функции в отдельный модуль.
  2. Защитите код только для основного процесса с помощью 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() расскажет вам, где это.