Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 27, 2009 18:30:02

anyNeT
От:
Зарегистрирован: 2009-05-11
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

python потоки

Все никак не могу разобраться с потоками :( Освоил только создание одного потока для выполнения фоновой задачи…

Продемонстрируйте мне пожалуйста работу с потоками на примере, например, брутфорса.

Сам пока написал следующее:

#!/usr/bin/python

import re
import sys
import threading
import urllib2
import time

old = time.time()
password = 'hello'
passwords = [тут множество паролей]

results = []

class Check(threading.Thread):
def __init__(self, pword):
threading.Thread.__init__(self)
self.pword = pword

def run(self):
if self.pword == password:
print 'Done:', self.pword
sys.exit(0)
else:
print 'Error:', self.pword

for p in passwords:
current = Check(p)
results.append(current)
current.start()

print time.time() - old
Но работает это чудо в 4 раза медленнее, чем без потоков :)

Заранее премного благодарен.



Офлайн

#2 Июнь 27, 2009 19:33:51

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

python потоки

Конечно. Создание потока - дорогая операция.
Попробуйте подумать, за счет чего использование потоков может ускорить ваш чудесный алгоритм?



Офлайн

#3 Июнь 27, 2009 20:25:49

anyNeT
От:
Зарегистрирован: 2009-05-11
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

python потоки

за счет одновременного выполнения нескольких задач, например =)



Офлайн

#4 Июнь 27, 2009 20:40:42

anyNeT
От:
Зарегистрирован: 2009-05-11
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

python потоки

Просто, если можно - правильный пример, чтобы я разобрался.



Офлайн

#5 Июнь 27, 2009 21:08:49

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

python потоки

С примером неинтересно. Да и не прочувствуешь.

Сколько ядер на твоей машине? Два, скорее всего.
А пару-тройку лет назад так вообще больше одного встречалось очень редко.
Тем не менее даже тогда многопоточные программы имели смысл, и их писали постоянно.
Зачем? Переключение потоков - операция тоже недешевая, а одновременно не получится выполнять задач больше, чем ядер на машине.
Что можно ускорить?
Кстати, в твоем примере пока не начнешь дергать urllib2 - не будет никакого ускорения от потоков, как не крути.
Почему?

P.S.
Со строгой одновременностью в Питоне туго - есть GIL.



Офлайн

#6 Июнь 27, 2009 21:26:10

anyNeT
От:
Зарегистрирован: 2009-05-11
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

python потоки

Сколько ядер на твоей машине? Два, скорее всего.
У меня дюрон 8 летней давности :)

Ну при 1 ядре процесс будет по любому 1, но можно разбить его на несколько потоков, выполняющихся параллельно.

Кстати, в твоем примере пока не начнешь дергать urllib2 - не будет никакого ускорения от потоков, как не крути.
Почему?
Даже не знаю :)



Отредактировано (Июнь 27, 2009 21:29:02)

Офлайн

#7 Июнь 28, 2009 16:50:34

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

python потоки

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

Бардак. И думать неохота…
Писать долгую телегу с объяснением базовых понятий параллелизма мне неохота.
Поэтому почитай что-нибудь сам, а когда вопросы станут поосмысленнее - можно продолжить.
Где читать - не знаю. В википедии наверняка кое-то есть. Язык программирования не важен - потоки практически везде одинаковые.
Может, другие камрады со ссылками помогут.



Офлайн

#8 Июнь 28, 2009 18:44:25

anyNeT
От:
Зарегистрирован: 2009-05-11
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

python потоки

Прочитал в вики:

процесс, порождённый в операционной системе, может состоять из нескольких потоков, выполняющихся «параллельно»
Наверное, я неправильно понял. Буду читать, спасибо! :)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version