Найти - Пользователи
Полная версия: Многопоточность, загрузка процессора
Начало » Python для экспертов » Многопоточность, загрузка процессора
1
Psixo
Есть небольшой код для проверки списка прокси, сокс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%
shiza
В приниципе можно вставить любой sleep(0.1).

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

Еще более правильное с точки зрения архитектуры - это сделать специальный пул коннектов. Но это уже следующий уровень экспиренса. =)
Psixo
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, спасибо за совет, попробую немного позже сделать синхронизацию .
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB