【问题标题】:Update CSV with new values every minute: sched,time vs. apscheduler每分钟用新值更新 CSV:sched,time vs. apscheduler
【发布时间】:2017-08-27 21:50:14
【问题描述】:

我有以下代码,旨在从网站中提取 json 数据并将其记录到 csv 文件中:

def rec_price():
    with urllib.request.urlopen('some_url') as url:
        data = json.loads(url.read().decode())
    df = pd.DataFrame(data)

    df1 = df[['bpi','time']]

    x = df1.loc['USD', 'bpi']['rate']
    y = df1.loc['updated', 'time']

    df2 = pd.DataFrame({'data': [x], 'time' : [y]}) 

    df2['time'] = pd.to_datetime(df2['time'])

    with open('out.csv', 'a') as f:
        df2.to_csv(f, header=False)

我想无限期地每 60 秒运行一次此代码。似乎可用的两个选项是安装apscheduler 或使用pythons 标准import sched, time 模块...我想知道,这两个模块之间有什么区别?一个更适合这项任务吗?我将如何实现该模块?

【问题讨论】:

  • while True 怎么样?在函数调用之间使用sleep 60
  • windows 还是 *nix?在 *nix 系统上,更好的解决方案是cron
  • @sKwa- 这将在 MacBook Pro 上运行- 如果这回答了您的问题
  • @Vinny 基于此处的另一个回复 stackoverflow.com/questions/474528/… 我认为您的方法无效
  • cron 仍然适用于 Mac

标签: python csv scheduled-tasks


【解决方案1】:
from threading import Timer

t = None # It is advisable to have a Timer() saved globally

def refresh ():
    global t
    # Get your CSV and save it here, then:
    t = Timer(60, refresh)
    t.daemon = True
    t.start()

refresh()

或者:

from thread import start_new_thread as thread
from time import sleep
from urllib2 import URLError, HTTPError, urlopen
import urllib2

def refresh ():
    while 1:
        try:
            # Get and save your CSV here, then:
            sleep(60)
        except (URLError, HTTPError):
            pass
        except urllib2.socket.timeout:
            pass
        except:
            break

thread(refresh,())
# Or just refresh() if you want your script to do just this and nothing else

要完成我的回答: sched 模块的作用与上面的代码非常相似,但它允许您添加“无限”数量的函数以随时调用,并且您还可以指定它们的执行优先级以尝试实时执行。简而言之,它模拟了 cron 的一部分。但是,对于你所需要的,这将是一个矫枉过正。您必须设置一个在固定时间后启动的事件,然后在执行后重新添加它,依此类推。当您在不同的时间间隔或使用不同的参数等触发多个函数时,您可以使用 sched。 老实说,我个人永远不会使用 sched 模块。它太粗糙了。相反,我会修改我上面介绍的代码来模拟 sched 的功能。

【讨论】:

  • 你会如何修改你的第一个建议以应用于多个函数?
  • 取决于您需要如何执行它们。如果它是具有更改参数的相同函数,我将使用 deque() 将它们放入,然后刷新会从队列中执行一段时间 pop()-ing,直到 deque() 为空,然后启动 Timer() 线程再试一次如果队列中有任何内容,则在间隔之后。这就像 sched 所做的那样。如果您想要执行更多操作,只需将每个操作放入其函数中,然后在 refresh() 中依次或在线程中调用它们,但在设置 Timer() 之前等待所有操作完成。
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多