Многопроцессорная обработка двух функций при совместном использовании данных - PullRequest
0 голосов
/ 10 декабря 2018

Я только начал работать с Python, поэтому, пожалуйста, потерпите меня.

Мой код выглядит примерно так (прямо сейчас) (упрощенно)

lst = []

def func1():
    while True:
        **doing some stuff with selenium, performing some operations on lst**

        **I never break the loop**

def func2():
    while True:
        **doing some stuff with selenium, performing some operations on lst**
        **I never break the loop**

Пока все хорошо.Тем не менее, мне нужно, чтобы обе функции запускались одновременно, а также делали вещи в одном и том же списке и обменивались ими.Например, func1 может добавить что-то к lst, а func2 может удалить что-то из lst, тогда func1 может удалить что-то и т. Д. Обе функции должны выполняться бесконечно, поэтому циклы infinte не облегчают это.

Я немного читал о многопоточности, но, насколько я понимаю, многопоточность на самом деле не работает параллельно, поэтому мой код будет выполняться медленнее.Это просто не вариант.Я также читал, что многопоточность и Selenium не совсем совпадают на небесах.

Итак, как мне этого добиться?Мне нужны обе функции, чтобы иметь возможность выполнять операции с моим списком при одновременной работе в течение неопределенного времени.

Я также мог бы использовать некоторую помощь по многопроцессорным процессам.Картирование, пулы, очереди ... Я даже не знаю, с чего начать.

Мне очень нужна ваша помощь, ребята, и я был бы очень признателен.

Дополнительная информация (на самом деле я не знаю, имеет ли это значение): все это выполняется на компьютере с Windows, используя Python 2.7 и Selenium and Chromedriver.

1 Ответ

0 голосов
/ 10 декабря 2018

Используйте прокси общего списка и lock для синхронизации lst между процессами.

Псевдокод:

import multiprocessing as mp

def func1(lst, lock):
    while True:
        lock.acquire()
        # **doing some stuff with selenium, performing some operations on lst**
        lock.release()

        # **I never break the loop**

def func2(lst, lock):
    while True:
        lock.acquire()
        # **doing some stuff with selenium, performing some operations on lst**
        lock.release()
        # **I never break the loop**

lst = mp.Manager().list()
lock = mp.Lock()
p1 = mp.Process(target=func1, args=(lst,lock))
p2 = mp.Process(target=func2, args=(lst,lock))
p1.start()
p2.start()
p1.join()
p2.join()

Обратите внимание, что элемент в lst должен быть скалярным по умолчанию, Python использует теневую копию для синхронизации между процессами.

Если lst содержит другие типы элементов, такие как list, dict или object, у вас естьпереназначить его на lst каждую операцию.

...