Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 9, 2012 11:22:35

vlados
От:
Зарегистрирован: 2011-07-28
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

Я вот сколько не лазил в интернете, но, что то не понимаю многопоточность, как начну читать документацию(не официальную, а обычные статьи), ничего не понимаю, то ли тупость моя, то ли написано не так, а как начинаешь немного понимать, сразу глава заканчивается и, начинается глава - пишем сервер… facepalm…
Не могли бы ли вы меня натолкнуть на хорошие статьи(на русском) или помочь примером?
Вот допустим простая функция, она берет строки из файла в которых находятся ссылки и определяет у них ИЦ, методом простого парсинга. Как сделать эту функцию многопоточной?

import re, urllib

urls = open('urls', 'r').readlines()
for url in urls:
def get_tic(url):
tic = urllib.urlopen('http://bar-navig.yandex.ru/u?ver=2&show=32&url=http://'+str(url)+'/').read()
tic = re.findall('value="(.*?)"', tic)
if tic == None:
tic = 0
return tic[0]
get_tic()
print 'done'



Отредактировано (Янв. 9, 2012 11:26:02)

Офлайн

#2 Янв. 9, 2012 17:36:50

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

Можно запустить несколько потоков, которые на вход будут принимать url, а на выходе отдавать tic. Так как накладные расходы на соединение с сервером низкие, время соединения сравнительно высокое и ресурсы машины большее время простаивают в ожидании ответа сервера, то запустив несколько потоков мы распараллелим работу и увеличим общую скорость. Но я не сказал бы, что это задача для начинающего. Стоит сделать какие-то простые вещи: научиться создавать потоки, запускать их, выполнять какую-то задачу с их помощью. Не зная конкретно в чем ваше затруднение, дать какие-то конкретные рекомендации тяжело. Задавайте вопросы, читайте статьи, накапливайте в голове критическую массу информации, обязательно пробуйте писать код. В какой-то момент количество само перейдет в качество.



Офлайн

#3 Янв. 9, 2012 17:43:56

vlados
От:
Зарегистрирован: 2011-07-28
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

Спасибо за ответ, но если можно, можете ли вы мне дать ссылок на статьи?



Офлайн

#4 Янв. 9, 2012 18:46:41

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

вот пара примеров запуска ф-ии в отдельном потоке

Офлайн

#5 Янв. 9, 2012 19:10:40

vlados
От:
Зарегистрирован: 2011-07-28
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

А есть ли какие-нибудь статьи, на русском, как работает многопоточность в питоне?



Офлайн

#6 Янв. 9, 2012 19:19:52

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

А по-моему это как раз очень хороший пример для начинающего, чтобы разобраться как все работает. Попробуйте сделать эту программку многопоточной. Я помогу. Задавайте вопросы.



Офлайн

#7 Янв. 9, 2012 19:29:29

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

Вот вам для затравки статейка:
http://www.wellho.net/solutions/python-python-threads-a-first-example.html
Ну и, конечно, официальная документация:
http://docs.python.org/library/threading.html



Офлайн

#8 Янв. 9, 2012 20:27:45

vlados
От:
Зарегистрирован: 2011-07-28
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

Ed, спасибо, 1 ссылка пригодилась!
Вот получившийся код:

from threading import Thread
import urllib, re, time

class tic(Thread):
def __init__(self, url):
Thread.__init__(self)
self.url = url
def run(self):
self.tic = urllib.urlopen('http://bar-navig.yandex.ru/u?ver=2&show=32&url=http://'+str(self.url)+'/').read()
self.tic = re.findall('value="(.*?)"', self.tic)
if self.tic == None: self.tic = 0
return int(tic)
print time.ctime()

list = open('s1', 'r').readlines()
reslist = []

for url in list:
url = url.replace('\r', '')
url = url.replace('\n', '')
current = tic(url)
reslist.append(current)
current.start()
#print url

for res in reslist:
res.join()
print res.url, res.tic
print time.ctime()
Как его можно улучшить? Избавится от не нужного например, упростить, улучшить?



Офлайн

#9 Янв. 9, 2012 22:55:12

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

С точки зрение многопоточности особо и не улучшишь, наверное. А сам код далек от идеала, конечно.
Вот тут по ссылкам походите - http://www.python.su/forum/viewtopic.php?pid=78753#p78753

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



Отредактировано (Янв. 9, 2012 22:55:55)

Офлайн

#10 Янв. 10, 2012 07:38:47

vlados
От:
Зарегистрирован: 2011-07-28
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите понять многопоточность.

Спасибо еще раз эд.
Буду изучать красивый код. Кстати, может есть, что-нибудь на русском? С английским знаком, читать могу, но с русским проще.
Кстати вот где-то тут видел пример многопоточности с multiprocessing(?), и еще с с похожим на quaqe(?). За чем они? Есть ли у них преймущество? Можете помочь с статьями? Заранее спасибо!



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version