2

Я обработки твиты с tweepy:Как распределить операции с привязкой к I/O в Python?

class StdOutListener(StreamListener): 
    def on_data(self, data): 
     process(json.loads(data)) 
     return True 

l = StdOutListener() 
stream = Stream(auth, l) 
stream.filter(track=utf_words) 

process функция получает содержимое URL-адресов (с запросами), включенной в твиты, обрабатывают данные с NLTK (я предполагаю, что это использует немного CPU) и сохраняет результат в Монго.

Проблема в том, что получение содержимого включенных URL-адресов занимает много времени и, следовательно, ограничивает мою скорость обработки. Как я пионически ускоряю эту вещь?

ответ

1

Вы можете использовать Питона «резьб» модуль:

import threading 
class YourThreadSubclass(threading.Thread): 
    def __init__(self,your_args): 
     threading.Thread.__init__(self) 
      #do whatever setup you want 
    def run(self): 
      process_data(self.some_property) 

threads = [YourThreadSubclass(args) for args in Iterable] 
for t in threads: 
    t.start() 
for t in threads: 
    t.join() 
return reduce(combiner, (t.result_field for t in threads)) 

Больше информации здесь: http://docs.python.org/2/library/threading.html

редактировать: Более непосредственно, вы могли бы раскошелиться покинуть поток всякий раз, когда on_data называется.

def on_data(self, data): 
    YourThreadSubclass(data).start() 

Разветвленная нить будет сохранять свои результаты асинхронно.

Если вы имеете дело с большим количеством запросов, вы также можете использовать пул потоков для управления потоками. Документы here

+0

У меня нет Iterable здесь, StreamListener обрабатывает входящие твиты как события, вызывает функцию on_data и блокирует до тех пор, пока это не будет выполнено. Я не уверен, как мне приспособить ваш пример к моему делу. – Moonwalker

+1

Отредактировано для пояснений. – akn320

Смежные вопросы