Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 23, 2014 22:28:22

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Нужна помощь с многопоточностью Selenium

Добрый вечер, коллеги.
Знаю, что не по правилам просить сделать за меня какую-либо работу, без собственных наработок. Нет мне оправдания, в общем.

Но, с Вашего разрешения, я все же попробую….
Имеем такой проект (основная часть кода урезана), использующий селениум вебдрайвер.
Необходимо сделать многопоточное приложение, но… Я еще не сталкивался с многопоточностью, мне тяжело себе даже представить стуктуру кода. Плюс к этому: приложение использует доступ к файлам (как в основном методе start(), так и в цикле: get_acc()). О локах и очередях, я конечно слыхивал, но опять же - не практиковал…

Прошу дать мне не хилый пинок, и наградить каким-нибудь абстрактным скелетом, дальше думаю я сам разберусь, согласно докам (чтение которых иногда вводит меня в жесткий ступор, благо стековер и гугл еще в моем распоряжении)

#imports
 
def is_element_present(driver, how, what):
    try: driver.find_element(by=how, value=what)
    except NoSuchElementException: return False
    return True
 
def load_data(filename):
    with open(filename, 'r') as file:
        data_list = [line.strip() for line in file]
    file.close()
    return data_list
 
def get_mail():
    mails = load_data('mails.txt')
    rand_mail = mails[0]
    mails.remove(rand_mail)
    with open('mails.txt', 'w') as file:
        [file.write('%s\n' % ml) for ml in mails]
    file.close()
    return rand_mail
 
def get_acc():
    accs = load_data('accs.txt')
    acc = accs[0]
    accs.remove(acc)
    with open('accs.txt', 'w') as file:
        [file.write('%s\n' % ml) for ml in accs]
    file.close()
    return acc
 
def save_valid(data):
    with open('valid.txt', 'a') as file:
        file.write('%s\n' % data)
    file.close()
 
def start(prox, login, passw):
    ....
    get_mail()
    ....
 
def check_proxy(proxy):
    import requests, requests.exceptions
    #http://user:pass@10.10.1.10:3128/
    proxies = {"http": proxy}
    try:
        resp = requests.get('http://seemyip.com/', proxies=proxies, timeout=10).text
    except requests.exceptions.RequestException:
        print('can\'t connect to proxy %s' % proxy)
        return False
    return True
 
 
accs = load_data('accs.txt')
proxy = load_data('proxy.txt')
 
for pr in proxy:
    if check_proxy(pr):
        x = get_acc()
        mail, passw = x.split(':')
        start(pr, mail, passw)

Отредактировано bs0d (Сен. 23, 2014 22:29:00)

Офлайн

#2 Сен. 24, 2014 19:41:22

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Нужна помощь с многопоточностью Selenium

Видимо ответа так и не дождусь

В общем планирую использовать библиотеку multiprocessing.dummy, класс Pool или Process
Могу сделать например через метод map класса Pool:

pool = Pool(5)
pool.map(start_method, list_of_accs)
Тут имеем 5 потоков, которые применят start_method к списку list_of_accs

Или через Process:
for x in range(5):
    p = Process(target=start_method, args=(llist_of_accs,))
    p.start()
В этом случае будет обработано, неизвестно почему, только 5 элементов списка llist_of_accs. Каким образом мне использовать этот вариант, чтобы был обработан весь список? Вариант с кол-вом потоков == кол-ву элементов списка - не подходит, список может быть и 50 элементов и 5000.

И каким образом (для обоих методов) мне разграничить доступ к list_of_accs, если start получает элемент списка например через такой метод:
def get_acc(llist_of_accs):
    try:
        acc = llist_of_accs[0]
        del llist_of_accs[0]
    except:
        acc = None
    with open('accs.txt', 'w') as file:
        [file.write('%s\n' % ac) for ac in list_of_accs]
        file.close()
    return acc
Пробовал и Lock и RLock, но тестовый код работает одинаково хорошо, хоть с ними хоть без них

З.Ы. почему методы мне удобнее называть функциями? О_О

Отредактировано bs0d (Сен. 24, 2014 20:02:34)

Офлайн

#3 Сен. 24, 2014 20:05:26

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Нужна помощь с многопоточностью Selenium

import urllib2
from multiprocessing.dummy import Pool as ThreadPool
 
urls = [
    'http://www.python.org',
    'http://www.python.org/about/',
    'http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html',
    'http://www.python.org/doc/',
    'http://www.python.org/download/',
    'http://www.python.org/getit/',
    'http://www.python.org/community/',
    'https://wiki.python.org/moin/',
    'http://planet.python.org/',
    'https://wiki.python.org/moin/LocalUserGroups',
    'http://www.python.org/psf/',
    'http://docs.python.org/devguide/',
    'http://www.python.org/community/awards/'
    # etc.. 
    ]
 
# Make the Pool of workers
pool = ThreadPool(4)
 
# Open the urls in their own threads
# and return the results
results = pool.map(urllib2.urlopen, urls)
 
#close the pool and wait for the work to finish 
pool.close()
pool.join()
 
# (c) http://toly.github.io/blog/2014/02/13/parallelism-in-one-line/



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

#4 Сен. 24, 2014 21:01:56

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Нужна помощь с многопоточностью Selenium

ajib6ept
Спасибо, я читал эту статью. как минимум - она не раскрывает вопроса: а что если метод внутри себя взаимодействует с другими списками или файлами. Т.е. в принципе я уже понял как это все работает, но хотелось бы сделать правильно, а не абы-как, чтобы не нарваться на кучу последующих граблей.

Допустим я буду использовать этот вариант, как мне правильно установить блокировки в методах, которые будут взаимодействовать с файлами и списками и будут вызываться из основного метода

Отредактировано bs0d (Сен. 24, 2014 21:06:58)

Офлайн

#5 Сен. 24, 2014 21:28:39

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Нужна помощь с многопоточностью Selenium

Не совсем понял, взяли из файлов исходные данные, закинули в очередь, после завершения сохранили.



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

#6 Сен. 24, 2014 21:30:55

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Нужна помощь с многопоточностью Selenium

bs0d
Необходимо сделать многопоточное приложение, но…

А цель какая? А то вдруг окажется, что в Jenkins достаточно галочку поставить напротив “Разрешить паралельный запуск тестов” .

Офлайн

#7 Сен. 24, 2014 23:28:23

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Нужна помощь с многопоточностью Selenium

необходимо быстро обрабатывать списки логин:пароль с помощью вебдрайвера
думаю мне эта галочка не помогла бы, даже если бы я заюзал дженкинс

Офлайн

#8 Сен. 25, 2014 00:21:02

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Нужна помощь с многопоточностью Selenium

ajib6ept
спасибо, почитаю об очередях

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version