Найти - Пользователи
Полная версия: Помогите понять многопоточность.
Начало » Python для новичков » Помогите понять многопоточность.
1 2 3
vlados
Я вот сколько не лазил в интернете, но, что то не понимаю многопоточность, как начну читать документацию(не официальную, а обычные статьи), ничего не понимаю, то ли тупость моя, то ли написано не так, а как начинаешь немного понимать, сразу глава заканчивается и, начинается глава - пишем сервер… 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'
Soteric
Можно запустить несколько потоков, которые на вход будут принимать url, а на выходе отдавать tic. Так как накладные расходы на соединение с сервером низкие, время соединения сравнительно высокое и ресурсы машины большее время простаивают в ожидании ответа сервера, то запустив несколько потоков мы распараллелим работу и увеличим общую скорость. Но я не сказал бы, что это задача для начинающего. Стоит сделать какие-то простые вещи: научиться создавать потоки, запускать их, выполнять какую-то задачу с их помощью. Не зная конкретно в чем ваше затруднение, дать какие-то конкретные рекомендации тяжело. Задавайте вопросы, читайте статьи, накапливайте в голове критическую массу информации, обязательно пробуйте писать код. В какой-то момент количество само перейдет в качество.
vlados
Спасибо за ответ, но если можно, можете ли вы мне дать ссылок на статьи?
o7412369815963
вот пара примеров запуска ф-ии в отдельном потоке
vlados
А есть ли какие-нибудь статьи, на русском, как работает многопоточность в питоне?
Ed
А по-моему это как раз очень хороший пример для начинающего, чтобы разобраться как все работает. Попробуйте сделать эту программку многопоточной. Я помогу. Задавайте вопросы.
Ed
Вот вам для затравки статейка:
http://www.wellho.net/solutions/python-python-threads-a-first-example.html
Ну и, конечно, официальная документация:
http://docs.python.org/library/threading.html
vlados
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()
Как его можно улучшить? Избавится от не нужного например, упростить, улучшить?
Ed
С точки зрение многопоточности особо и не улучшишь, наверное. А сам код далек от идеала, конечно.
Вот тут по ссылкам походите - http://www.python.su/forum/viewtopic.php?pid=78753#p78753

Насчет threading можно наверное напридумывать вам дополнительных требований к этой задачке, чтобы попользовать другие его аспекты, как то: локи, семафоры, ивенты, таймеры и прочая фигня, но мне кажется, что вы и сами это можете сделать.
vlados
Спасибо еще раз эд.
Буду изучать красивый код. Кстати, может есть, что-нибудь на русском? С английским знаком, читать могу, но с русским проще.
Кстати вот где-то тут видел пример многопоточности с multiprocessing(?), и еще с с похожим на quaqe(?). За чем они? Есть ли у них преймущество? Можете помочь с статьями? Заранее спасибо!
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