Подтвердить что ты не робот

Как правильно закрыть твипичный поток

Я пытаюсь выяснить, как правильно закрыть асинхронный поток tweepy.

Модуль tweedy streaming можно найти здесь.

Я запускаю поток следующим образом:

stream = Stream(auth, listener)
stream.filter(track=['keyword'], async=True)

При закрытии приложения я пытаюсь закрыть поток так же просто, как:

stream.disconnect()

Этот метод, похоже, работает по назначению, но, похоже, он имеет одну проблему: поток потока по-прежнему находится в середине цикла (ожидание/обработка твитов) и не будет убит до следующего цикла, поэтому, когда поток получает чириканье даже после закрытия приложения, он по-прежнему пытается вызвать объект-слушатель (это можно увидеть с помощью простого синтаксиса печати на объекте слушателя). Я не уверен, что это плохо или если его можно просто игнорировать.

У меня есть 2 вопроса:

  • Это лучший способ закрыть поток или я должен использовать другой подход?
  • Не следует ли создать асинхронный поток в качестве потока демона?
4b9b3361

Ответ 1

У меня была та же проблема. Я исправил его перезагрузкой script. Tweepy Stream не останавливается до следующего входящего твита.

Пример:

import sys
import os

python=sys.executable

time.sleep(10)

print "restart"
os.execl(python,python,*sys.argv)

Я не нашел другого решения.

Ответ 2

Я не уверен, что это относится к вашей ситуации, но, как правило, вы можете убирать соответствующие объекты после себя, помещая их в блок with:

with stream = Stream(auth, listener):
    stream.filter(track=['keyword'], async=True)
    # ...
# Outside the with-block; stream is automatically disposed of.

То, что "удаляет" на самом деле означает, что он вызывает функции __exit__.
Предположительно tweepy переопределит это, чтобы сделать правильную вещь.
Как подсказывает @VooDooNOFX, вы можете проверить источник, чтобы быть уверенным.

Ответ 3

Это по дизайну. Посмотрев на источник, вы заметите, что у разъединения нет возможности немедленного завершения.

def disconnect(self):
    if self.running is False:
        return
    self.running = False

При вызове функции disconnect() он просто устанавливает self.running = False, который затем проверяется в следующем цикле метода _

Вы можете игнорировать этот побочный эффект.

Ответ 4

Вместо перезапуска script, как предлагает @burkay, я, наконец, удалил объект Stream и начал новый. В моем примере, кто-то хочет добавить нового пользователя, которому нужно следовать, поэтому я обновляю список треков следующим образом:

stream.disconnect() # that should wait until next tweet, so let delete it
del stream
# now, create a new object
stream = tweepy.Stream( auth=api.auth, listener=listener )
stream.userstream( track=all_users(), async=True )