如何在Python中1小时后退出函数

时间:2014-01-10 05:26:31

标签: python twitter twitter-streaming-api

我正在制作一个简单的应用程序来传播Twitter的公共时间线,我希望流媒体在一小时后自动停止,我不知道如何做到这一点。我阅读了datetime和timeit文档,但无法理解它们。这是我的代码,它正在流式传输我想要的时间线,但是无限期。

from twython import TwythonStreamer
import json
import os
import datetime
from datetime import *
APP_KEY = 'XX'
APP_SECRET = 'XX'
OAUTH_TOKEN = 'XX'
OAUTH_TOKEN_SECRET = 'XX'
class MyStreamer(TwythonStreamer):

    def on_success(self, data):
        print data['text']
        with open('scratch1.json', 'ab') as outfile:
            json.dump(data, outfile, indent = 4)
        with open('scratch2.json', 'ab') as xoutfile:
            json.dump(data, xoutfile, indent = 4)
        return


    def on_error(self, status_code, data):
        print status_code
        return True # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True # Don't kill the stream

stream = MyStreamer(APP_KEY, APP_SECRET,
                    OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
stream.statuses.filter(follow = [95995660, 8820362])

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

使用datetime.datetime.now()方法获取当前日期时间对象,然后使用timedelta类为其添加一小时。

import datetime
stop_time = datetime.datetime.now() + datetime.timedelta(hours=1)

# ...

# in relevant function ...
if datetime.datetime.now() > stop_time:
    stop_streaming()

我不熟悉你TwythonStreamer课程,但可能是这样的:

class MyStreamer(TwythonStreamer):

    # the init function is called when you create instance of class
    def __init__(self):
        self.stop_time = datetime.datetime.now() + datetime.timedelta(hours=1)

    # ...

    def on_success(self, data):
        if datetime.datetime.now() > self.stop_time:
            raise Exception("Time expired")

        # ...

答案 1 :(得分:1)

因为我想提出一个主要是完整的解决方案。这是我的版本:

#!/usr/bin/env python


import sys
import json
import datetime


from twython import TwythonStreamer


from circuits import Component, Event, Debugger, Timer


APP_KEY = 'XX'
APP_SECRET = 'XX'
OAUTH_TOKEN = 'XX'
OAUTH_TOKEN_SECRET = 'XX'


class MyStreamer(TwythonStreamer):

    def on_success(self, data):
        print data['text']
        with open('scratch1.json', 'ab') as outfile:
            json.dump(data, outfile, indent=4)
        with open('scratch2.json', 'ab') as xoutfile:
            json.dump(data, xoutfile, indent=4)
        return

    def on_error(self, status_code, data):
        print status_code
        return True  # Don't kill the stream

    def on_timeout(self):
        print >> sys.stderr, 'Timeout...'
        return True  # Don't kill the stream


class Check(Event):
    """Check Event"""


class Terminate(Event):
    """Terminate Event"""


class App(Component):

    def init(self, *args, **kwargs):
        self.stream = MyStreamer(
            APP_KEY, APP_SECRET,
            OAUTH_TOKEN, OAUTH_TOKEN_SECRET
        )

        interval = datetime.datetime.now() + datetime.timedelta(hours=1)
        Timer(interval, Terminate(), self.channel).register(self)

        Timer(10, Check(), persist=True, channel=self.channel).register(self)

    def terminate(self):
        raise SystemExit(0)

    def check(self):
        self.stream.statuses.filter(follow=[95995660, 8820362])


app = App()
Debugger().register(app)
app.run()

这为您的解决方案circuits添加了一个额外的库/框架,它是强大的事件和内置Timer组件。

NB:我没有测试过这个。我会把它留给你,因为我没有特别使用twython Twtiter客户端库或任何它的API。祝你好运!

另请注意,我假设您不想连续检查流,因为Twitter API可能有某种限制。因此,第二个计时器将每10秒触发Check个事件,并在正在运行的应用程序的生命周期内持续存在。

答案 2 :(得分:1)

我无法通过pztrick的修改复制Apoorv的代码。写作:

class MyStreamer(TwythonStreamer):  
   def __init__(self):  
        self.stop_time = dt.datetime.now() + dt.timedelta(minutes=1)

会生成此错误消息:

TypeError: __init__() takes 1 positional argument but 5 were given

以下不起作用:

类MyStreamer(twy.TwythonStreamer):

def __init__(self):
    self.stop_time = dt.datetime.now() + dt.timedelta(minutes=1)
    self.app_key = APP_KEY
    self.app_secret = APP_SECRET
    self.oauth_token = OAUTH_TOKEN
    self.oauth_token_secret = OAUTH_TOKEN_SECRET

然而,在没有 init 的情况下定义stop_time的工作原理是什么。我的最终解决方案如下:

class MyStreamer(twy.TwythonStreamer):

    stop_time = dt.datetime.now() + dt.timedelta(minutes=1)

    def on_success(self, data):
        if dt.datetime.now() > self.stop_time:
            raise Exception('Time expired')

        fileName = self.fileDirectory + 'Tweets_' + dt.datetime.now().strftime("%Y_%m_%d_%H") + '.txt'  # File name includes date out to hour.
        open(fileName, 'a').write(json.dumps(data) + '\n')

我不熟悉课程,所以不明白为什么会这样,但我很高兴它确实如此。

答案 3 :(得分:0)

我推荐datetime.datetime.now()模块
datetime.datetime.now()+ datetime.deltatime(seconds = 3600)作为你的一小时停止时间。