Найти - Пользователи
Полная версия: python потоки
Начало » Python для новичков » python потоки
1
anyNeT
Все никак не могу разобраться с потоками :( Освоил только создание одного потока для выполнения фоновой задачи…

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

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

#!/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 раза медленнее, чем без потоков :)

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

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

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

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

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

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

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