Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 4, 2014 09:30:58

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Вопрос про многопоточность

Использую следующую структуру для отправки GET-запросов

class MyClass(threading.Thread):
	def __init__(self,queue):
		threading.Thread.__init__(self)
		self.queue = queue
	def run(self):
		while True:
			try: item = self.queue.get_nowait()
			except Queue.Empty: break
			try: self.worker(item)
			except Exception, detail: traceback.print_exc()
			self.queue.task_done()
	def worker(self, host):
		g = Grab()
		g.go(host)
def main():
	q = Queue.Queue()
	urls = ['http://ya.ru', 'http://yandex.ru', 'http://ramber.ru', 'http://nigma.ru'] 
	th = 3
	for url in urls:
		q.put(url)
	for i in xrange(th):
		t = MyClass(q)
		t.start()
	q.join()
	print "Finish"
if __name__ == '__main__':
	logging.basicConfig(level=logging.DEBUG)
	main()

Вопрос возник, есть база в которой хранятся URL'ы, много - 1000/10000/100000
Как мне лучше организовать многопоточный чек по ним, т.е. закинуть в список urls ?



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Офлайн

#2 Янв. 5, 2014 00:50:51

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Вопрос про многопоточность

А чем вас текущая схем не устраивает? как бы в общем то вполне себе хороший метод использовать очередии потоки.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Янв. 5, 2014 12:46:56

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

Вопрос про многопоточность

ajib6ept
есть база в которой хранятся URL'ы, много - 1000/10000/100000
Я бы при большом кол-ве ссылок, работал бы с базой, там бы и помечал скачено/не скачено/ошибка.
+ Можно запустить несколько процессов параллельно / на разных машинах
+ Когда скрипт выпадет / или нужно будет остановить что-б его подправить, для продолжения нужно будет просто запустить скрипт.

Офлайн

#4 Янв. 5, 2014 18:08:38

ajib6ept
От: От: От: От: От: От: От: От:
Зарегистрирован: 2013-08-04
Сообщения: 297
Репутация: +  26  -
Профиль   Отправить e-mail  

Вопрос про многопоточность

А чем вас текущая схем не устраивает? как бы в общем то вполне себе хороший метод использовать очередии потоки.

Я еще не пробовал, но если я так сгенерю список на 100 000 элементов не будет проблем в памятью у меня (4GB) или на сервере (0,5GB) при запуске скрипта?

con = sqlite3.connect(configFileDB)
cur = con.cursor()
urls = [u[0] for u in cur.execute('SELECT url FROM ' + configTablename)]

+ Можно запустить несколько процессов параллельно / на разных машинах

Это надо смотреть в сторону celery?



_________________________
Python golden rule: Do not PEP 8 unto others; only PEP 8 thy self.
Don't let PEP 8 make you insanely intolerant of other people's code.

Отредактировано ajib6ept (Янв. 5, 2014 18:09:39)

Офлайн

#5 Янв. 6, 2014 15:46:22

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

Вопрос про многопоточность

ajib6ept
но если я так сгенерю список на 100 000 элементов
Зачем? Черпайте по одному.
Можете сгенерировать и посмотреть сколько памяти заняло, навскидку 10-30Мб

ajib6ept
Это надо смотреть в сторону celery?
Необязательно, просто черпать ссылки из сетевой БД (MongoDB, Mysql, …)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version