7

リクエストを使用して、Twitterのユーザーストリームから強力な消費方法を作成しようとしています。これまでに、次の基本的な作業例を作成しました。

"""
Example of connecting to the Twitter user stream using Requests.
"""

import sys

import json

import requests

from oauth_hook import OAuthHook

def userstream(access_token, access_token_secret, consumer_key, consumer_secret):
    oauth_hook = OAuthHook(access_token=access_token, access_token_secret=access_token_secret, 
                           consumer_key=consumer_key, consumer_secret=consumer_secret, 
                           header_auth=True)

    hooks = dict(pre_request=oauth_hook)
    config = dict(verbose=sys.stderr)
    client = requests.session(hooks=hooks, config=config)

    data = dict(delimited="length")
    r = client.post("https://userstream.twitter.com/2/user.json", data=data, prefetch=False)

    # TODO detect disconnection somehow
    # https://github.com/kennethreitz/requests/pull/200/files#L13R169
    # Use a timeout? http://pguides.net/python-tutorial/python-timeout-a-function/
    for chunk in r.iter_lines(chunk_size=1):
        if chunk and not chunk.isdigit():
            yield json.loads(chunk)

if __name__ == "__main__":
    import pprint
    import settings
    for obj in userstream(access_token=settings.ACCESS_TOKEN, access_token_secret=settings.ACCESS_TOKEN_SECRET, consumer_key=settings.CONSUMER_KEY, consumer_secret=settings.CONSUMER_SECRET):
        pprint.pprint(obj)

ただし、切断を適切に処理できる必要があります。現在、ストリームが切断されると、上記はハングし、例外は発生しません。

これを達成するための最良の方法は何でしょうか?urllib3接続プールを介してこれを検出する方法はありますか?タイムアウトを使用する必要がありますか?

4

1 に答える 1

0

client.post() 呼び出しにタイムアウト パラメータを追加することをお勧めします。http://docs.python-requests.org/en/latest/user/quickstart/#timeouts

ただし、リクエストは TCP タイムアウトを設定しないことに注意することが重要であるため、次のように設定できます。

import socket
socket.setdefaulttimeout(TIMEOUT)
于 2014-06-23T17:43:24.733 に答える