2017-08-27 39 views
0

我有下面的代码设计从网站拉JSON数据,并将其记录到CSV文件:更新CSV用新值每分钟:SCHED,时间与apscheduler

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或使用蟒蛇标准import sched, time模块...我想知道,这两个模块之间有什么区别?是否更适合这项任务?我将如何实现该模块?

+0

'while True'呢?在函数调用 – Vinny

+0

窗口或* nix之间使用“sleep 60”在* nix系统上,更好的解决方案将是'cron'。 – sKwa

+0

@ sKwa-这将在MacBook Pro上运行 - 如果回答您的问题 – zsad512

回答

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 

要完成我的回答: 排程模块确实非常类似的事情,如上面的代码,但它允许您添加在任何时间被称为“不定”的功能数你也可以指定执行的优先级来尝试实时执行。总之,它模拟了cron的一部分。但是,对于你所需要的,这将是一个矫枉过正的问题。您必须设置一个事件,在固定时间后启动,然后在执行后重新添加,等等。当你有不止一个函数被以不同的时间间隔或不同的参数激发时,你可以使用sched。 说实话,我个人从不使用sched模块。这太粗糙了。相反,我会修改上面介绍的代码来模拟sched的功能。

+0

你会如何推荐你的第一个建议,以适用于多个功能? – zsad512

+0

取决于你需要如何执行它们。如果它与改变参数的函数相同,我将使用deque()将它们放入,然后刷新会从队列中弹出(),直到deque()为空,然后启动Timer()线程以再次尝试在间隔之后如果队列中有任何东西。这就像调度一样。如果有更多的动作需要执行,只需将其中的每一个放在其函数中,并在refresh()中一个接一个地或在线程中调用它们,但在设置Timer()之前等待它们全部完成。 – Dalen