2017-04-06 40 views
0

APScheduler(3.3.1)py2.7APScheduler查找對象錯誤

我用這個代碼,當我使用內存作爲工作店內它可以很好地工作做好我的工作,但我有太多的工作和我的記憶中服務器是有限的,所以我更改SQLAlchemyJobStore作爲作業存儲,但我得到了查找錯誤。如何解決它。

代碼:

def script(indicator, strategy_name, real_time=False): 
    # Solve No handlers could be found for logger 「apscheduler.scheduler 
    import logging 
    logging.basicConfig(level=logging.ERROR, 
         format='%(name)-12s %(asctime)s %(levelname)-8s %(message)s', 
         datefmt='%a, %d %b %Y %H:%M:%S') 
    try: 
     job_defaults = { 
      'coalesce': False, 
      'max_instances': 1, 
      "misfire_grace_time": config.real_time_script_interval + 5, 
     } 
     executors = { 
      'default': ThreadPoolExecutor(60), 
     } 
     jobstores = { 
      "default": SQLAlchemyJobStore(url='sqlite:///jobs.sqlite') 
     } 

     scheduler = BlockingScheduler(daemonic=True, jobstores=jobstores, job_defaults=job_defaults, 
             executors=executors) 
     module = __import__("%s.%s" % (indicator, strategy_name), fromlist=[strategy_name]) 
     if real_time: 
      for st in module.strategy: 
       scheduler.add_job(st.run, "interval", seconds=config.real_time_script_interval) 
     else: 
      for st in module.strategy: 
       # 計算最近的下一個準點時間 
       start_time = _recent_time(st.run_period) 
       scheduler.add_job(st.run, "interval", **start_time) 
     scheduler.start() 
    except Exception as e: 
     logger.get("run-log").error(error_msg()) 

錯誤:

apscheduler.jobstores.default Thu, 06 Apr 2017 10:50:32 ERROR Unable to restore job "d100a4b24e2d49c3ad51305fd846e5f5" -- removing it 
Traceback (most recent call last): 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 135, in _get_jobs 
    jobs.append(self._reconstitute_job(row.job_state)) 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 122, in _reconstitute_job 
    job.__setstate__(job_state) 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/job.py", line 260, in __setstate__ 
    self.func = ref_to_obj(self.func_ref) 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/util.py", line 277, in ref_to_obj 
    raise LookupError('Error resolving reference %s: error looking up object' % ref) 
LookupError: Error resolving reference base.strategy:Strategy.run: error looking up object 
apscheduler.jobstores.default Thu, 06 Apr 2017 10:50:32 ERROR Unable to restore job "2602167cd3c745c2b0764a2b63da1a3a" -- removing it 
Traceback (most recent call last): 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 135, in _get_jobs 
    jobs.append(self._reconstitute_job(row.job_state)) 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 122, in _reconstitute_job 
    job.__setstate__(job_state) 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/job.py", line 260, in __setstate__ 
    self.func = ref_to_obj(self.func_ref) 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/util.py", line 277, in ref_to_obj 
    raise LookupError('Error resolving reference %s: error looking up object' % ref) 
LookupError: Error resolving reference base.strategy:Strategy.run: error looking up object 
apscheduler.jobstores.default Thu, 06 Apr 2017 10:50:32 ERROR Unable to restore job "3eb917670e7642b8848a165268df8913" -- removing it 
Traceback (most recent call last): 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 135, in _get_jobs 
    jobs.append(self._reconstitute_job(row.job_state)) 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 122, in _reconstitute_job 
    job.__setstate__(job_state) 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/job.py", line 260, in __setstate__ 
    self.func = ref_to_obj(self.func_ref) 
    File "/Users/wyx/bitcoin_workspace/fibo-strategy/.env/lib/python2.7/site-packages/apscheduler/util.py", line 277, in ref_to_obj 
    raise LookupError('Error resolving reference %s: error looking up object' % ref) 
LookupError: Error resolving reference base.strategy:Strategy.run: error looking up object 

補充指令亞歷克斯格隆霍姆的問題在這裏,因爲它是很難在評論

在基地/ strategy_util.py地說:

base_strategy是一些類,其中繼承 BaseStrategy類base/strategy.py。該BaseStrategy有運行方法

def _strategy(base_strategy, minute, ticker_table_format): 
    class Strategy(base_strategy): 
     run_period = minute 

     def _init_params(self): 
      self.ticker_table_format = ticker_table_format 

    return Strategy() 


def _create_strategy(base_strategy, minute_list=ALL_MINUTE): 
    strategy_list = [] 
    for minute in minute_list: 
     for ticker_table_format in const.TICKER_TABLE_FORMAT.ALL: 
      st = _strategy(base_strategy, minute, ticker_table_format) 
      strategy_list.append(st) 
    return strategy_list 


def ma_strategy(base_strategy): 
    return _create_strategy(base_strategy) 

在MA/touch_avg.py:

MA_TOUCH_AVG繼承的BaseStrategy類

from base.strategy import MA_TOUCH_AVG 
from base.strategy_util import ma_strategy 

strategy = ma_strategy(MA_TOUCH_AVG) 

然後我用click調用類的策略python run_strategy.py run MA touch_avg

在run_strategy.py中:

@cli.command() 
@click.argument('indicator') 
@click.argument('strategy_name') 
def run(indicator, strategy_name): 
    """ run indicator strategy_name """ 
    real_time_strategy_name = ["touch_avg", "limit"] 
    util.script(indicator, strategy_name, 
       real_time=strategy_name in real_time_strategy_name) 
+0

你有一個名爲'base.strategy'的模塊,其中有一個名爲'Strategy'的類和一個名爲'run()'的方法? –

+0

你好@AlexGrönholm我添加更多關於我的問題的細節。 – wyx

回答

1

您遇到此問題的原因是因爲您在函數中動態創建類。 APScheduler將對預定功能的引用存儲爲module:varname。調度程序如何預期在函數中找到您正在創建的類?

+0

我希望我可以使用另一種方法來代替cPickle序列化 – wyx

+0

目前還不行。但這與問題無關。調度程序需要知道如何在啓動時找到您的預定功能。 –

+0

這解決了我的問題!你總是定義另一個模塊及其函數來調用'add_job(func)',而調度器有它的類。謝謝! – FaithReaper