LINUX.ORG.RU

Selenium, phantomjs, и python. Проблемы при многопоточной работе.

 , , ,


0

2

Доброго вечера, Лоровцы. В общем, есть такая проблема. Запускаю selenium grid, вот так:

java -Xms512m -Xmx2048m -jar selenium-server-standalone-2.45.0.jar -role hub -log ./out.log 
Потом запускаю как selenium-node сотню процессов phantomjs на разных портах, и подключаю к selenium grid.

Запускаю так:

for port in {8080..8180}; do phantomjs --webdriver=192.168.1.155:$port --webdriver-selenium-grid-hub=http://172.17.0.7:4444 &  done

Всё по логам запускается, в selenium grid console видно все процессы, видно что подключены, например, так:

[INFO  - 2015-03-23T18:41:57.883Z] HUB Register - register - Registered with grid hub: http://172.17.0.7:4444/ (ok)
[INFO  - 2015-03-23T18:41:57.886Z] HUB Register - register - Registered with grid hub: http://172.17.0.7:4444/ (ok)
[INFO  - 2015-03-23T18:41:57.887Z] HUB Register - register - Registered with grid hub: http://172.17.0.7:4444/ (ok)
[INFO  - 2015-03-23T18:41:57.889Z] HUB Register - register - Registered with grid hub: http://172.17.0.7:4444/ (ok)
[INFO  - 2015-03-23T18:41:57.890Z] HUB Register - register - Registered with grid hub: http://172.17.0.7:4444/ (ok)
[INFO  - 2015-03-23T18:41:57.891Z] HUB Register - register - Registered with grid hub: http://172.17.0.7:4444/ (ok)
[INFO  - 2015-03-23T18:41:57.893Z] HUB Register - register - Registered with grid hub: http://172.17.0.7:4444/ (ok)

Но при использовании вот такого кода(запускается 10 python-процессов, подключаются к selenium grid, вызывают браузер, и загружают\скриншотят страницу, выпадает следующая ошибка, от самой python-программы:

selenium.common.exceptions.WebDriverException: Message: cannot forward the request 192.168.1.155:8132 failed to respond
Stacktrace:
    at org.openqa.grid.web.servlet.handler.RequestHandler.process (RequestHandler.java:139)
    at org.openqa.grid.web.servlet.DriverServlet.process (DriverServlet.java:83)
    at org.openqa.grid.web.servlet.DriverServlet.doPost (DriverServlet.java:67)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:820)
    at org.seleniumhq.jetty7.servlet.ServletHolder.handle (ServletHolder.java:565)

Никаких фаерволов нет, подсети друг-друга видят, и т.п.

Сам скрипт на Python:

#!/usr/bin/env python2.7
# coding=utf-8

import os
import time
import random
from termcolor import colored
from multiprocessing import Pool
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.common.exceptions import WebDriverException

url1 = ['https://yandex.ru']
urls = url1 * 2000

def main(url):
	###
	file = './tmp/'+str(random.random())+'.png'
	###
	print colored('start browser with id = '+str(os.getpid()), 'green')
	###
	try:
		driver = webdriver.Remote(
			command_executor='http://172.17.0.7:4444/wd/hub',
			desired_capabilities={
	            "browserName": "phantomjs",
        	})
	except WebDriverException:
		###
		print colored('Browser fail to start, try again', 'red')
		###
		print colored('Waiting for new browser', 'red')
		###
		time.sleep(30)
		####
		driver = webdriver.Remote(
			command_executor='http://:4444/wd/hub',
			desired_capabilities={
	            "browserName": "phantomjs",
        	})
	###
	driver.set_window_size(1440, 900)
	#browser.maximize_window() 
	driver.implicitly_wait(40)
	driver.set_page_load_timeout(80)
	###
	time.sleep(5)
	###
	print 'browser is load = '+str(os.getpid())
	###
	print 'Get page = '+str(os.getpid())+' | '+str(url)
	###
	driver.get(url)
	time.sleep(20)
	###
	print colored('Save screenshot = '+str(os.getpid()), 'cyan')
	###
	driver.save_screenshot(file)
	time.sleep(10)
	###
	print 'Stay to memory = '+str(os.getpid())
	###
	time.sleep(5)
	###
	print colored('Free memory!', 'green')
	driver.quit()

pool 			= Pool(processes=10)
#pool = Pool(80)
count = 0
while count < len(urls):
	print urls[count]
	pool.map(main, urls[count])
	time.sleep(5)
	count += 1

#result.wait()
pool.close()
pool.join()

В логе selenium-grid никаких ошибок нет, только инфа о старте новой сессии(одной), и всё.

В чём может быть дело? Уже ума не приложу.

Прошу прощенья за оффтоп, а ты опенсурц пилишь?

По теме: ты в один поток пробовал? Под отладчиком смотрел?

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

Или это Jython?

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 1)
Ответ на: комментарий от pon4ik

Ну, я для себя одну штуку пилю, вряд ли она кому-то понадобится. :)

В один поток пробовал, всё вроде ок было.

Типа subprocess? Можно конечно это использовать, но как-то костыльно.

Нет, я использую обычный python.

gIiIjony
() автор топика

Всем снова здравствуйте. В общем, путём проб и ошибок я что-то да сделал. Для начала скажу, что пробовал запускать один selenium grid, и пять phantomjs-процессов, подключённых к нему, но всё-равно представленная мною в первом сообщении программа падала с такими же ошибками. Прошло много времени, было произведено много тестов типа «а так?», и «ну, давай», и у меня что-то получилось запустить всё это дело. В общем, я запустил selenium grid, подключил к нему 6(!) phantomjs на разных портах, в коде изменил количество процессов Пайтона до 5, и всё прекрасно заработало, никаких падений. И вот дурная мысль пришла мне в голову, и которую я сейчас буду пробовать на деле: запускаем 80 selenium grid, по 6 phantomjs-нод(использоваться так же будет 5) подключённых к каждому, потом пишем алгоритм, который будет запоминать сколько браузеров программа запустила на каком-либо selenium grid'е, и алгоритм, который будет подставлять хост selenium grid в переменной для запуска браузера. То есть получится, что мы будем равномерно размазывать нагрузку на разные selenium grid. Это конечно же адский, ужаснейший до огромной степени костыль, но мне кажется это сработает. Если у вас будут какие-то идеи, или есть уже опыт в использовании большого числа phantomjs в связке с selenium grid и Python, то прошу оставлять свои комментарии. Всем спасибо за внимание. :-)

gIiIjony
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.