Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 15, 2007 15:30:47

Psixo
От:
Зарегистрирован: 2007-09-12
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность, загрузка процессора

Есть небольшой код для проверки списка прокси, сокс5 серверов на валидность. Для упрощения,просто скачивается страница с сервера.
Нечто подобное:

def Get_Page(page, headers={}, proxy=""):
    #Настраиваем прокси
    old_socket = socket.socket
    if proxy:
        socks5, port = string.split(proxy, ":")
        socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, socks5, int(port))
        socket.socket = socks.socksocket
    #Формируем запрос и отправляем его
    urllib2.socket.setdefaulttimeout(10)
    req = urllib2.Request(page)
    for key, value in headers.items():
        req.add_header(key, value)
    try:
        F = urllib2.urlopen(req)
    except:
        socket.socket = old_socket
        return ""
    
    #Считываем результат
    result = "%s"%F.headers
    for line in F:
        result += line
    socket.socket = old_socket
    return result
def Check_Proxy(proxy, page="http://ya.ru"):
    headers = {'Referer' : 'ya.ru',
               'User-Agent': agent_list[random.randint(0,len(agent_list)-1)],
               'Accept-Language' : 'en-us,en;q=0.5',
               'Accept' : 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
               'Accept-Charset' : 'utf-8;q=0.7,*;q=0.7'
               }
    respone = Get_Page(page, headers=headers, proxy=proxy)
    if(len(respone) > 5):
        good_proxy.append(proxy)
        return 1
    return 0
Для работы с соксами используется SocksiPy

Так вот,в случаи запуска потоков с вызовом этой функции,загрузка на проц 100%. Даже при двух потоках %)

Пример вызова:
i = 0
thread_count = 3
thread_list  = []
while i < len(proxy_list):
    if( (threading.activeCount() < thread_count) and (i < len(proxy_list)) ):
        thread_list.append(threading.Thread(target=Check_Proxy, args=[proxy_list[i]]))
        thread_list[i].start()
        time.sleep(1)
        i += 1

Немного коряво,но думаю понятно.
Питон использую не слишком давно,так что просьба сильно не пинать. =)

П.С.: time.sleep(1) добавил чтобы немного снизить нагрузку,но если его убрать 100%



Отредактировано (Ноя. 15, 2007 15:33:17)

Офлайн

#2 Ноя. 15, 2007 16:11:48

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность, загрузка процессора

В приниципе можно вставить любой sleep(0.1).

Но если по умному - надо делать синхронизацию между потоками.
Для этого есть специальные объекты.
Смысл в том, что запускающий цикл будет в спячке - пока не произойдет завершение нити.
Почитать об этом можно здесь http://www.intuit.ru/department/pl/python/11/python_11.html

Еще более правильное с точки зрения архитектуры - это сделать специальный пул коннектов. Но это уже следующий уровень экспиренса. =)



Отредактировано (Ноя. 15, 2007 16:36:16)

Офлайн

#3 Ноя. 16, 2007 07:35:26

Psixo
От:
Зарегистрирован: 2007-09-12
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

Многопоточность, загрузка процессора

i = 0
thread_list  = []
while i < len(proxy_list):
    if( (threading.activeCount() < thread_count) and (i < len(proxy_list)) ):
        thread_list.append(threading.Thread(target=Check_Proxy, args=[proxy_list[i]]))
        thread_list[i].start()
        i += 1
    else:
        time.sleep(1)
Вынес засыпание в else . Совсем что-то тормозить я стал %)

shiza, спасибо за совет, попробую немного позже сделать синхронизацию .



Отредактировано (Ноя. 16, 2007 07:35:51)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version