2017-10-29 3 views
0

코드 실행을 스케줄링하는 메타 데이터 기반 접근 방식을 달성하는 데 어려움을 겪고 있습니다.Python - 조건부/메타 데이터 기반 클래스 가져 오기 및 실행

기본적으로 특정 유형으로 태그 지정된 처리 할 작업 항목의 대기열을 작성하고자합니다. 작업 항목을 처리하려는 연관된 '소비자'클래스와 메소드가 있습니다.

최종 목표는 작업이 특정 유형의 대기열에 들어가고 연관된 클래스가 작업을 처리하도록 인스턴스화되는 완전 데이터베이스 기반 접근 방식을 사용하는 것입니다.

지금은 dict (proc_dict)로 작업하겠습니다.

  • 그렇다면, 어떻게 패턴 이런 종류의 인내해야하는 경우

    1. : 이해하기 위해 사투를 벌인거야

      { 
          "_id" : ObjectId("59f6490b816c7bcb39375b8d"), 
          "data" : { 
           "ts" : { 
            "date_last_modified" : ISODate("2017-10-29T20:42:50.801+0000"), 
            "date_last_run" : null 
           }, 
           "manufacturer" : "xxxxx", 
           "status" : "active", 
           "_id" : ObjectId("59f63d5da54d752e56150af7"), 
           "schedule" : "weekly", 
           "manufacturer_type" : "Business", 
           "url" : "https://www.xxxx/", 
           "job_type" : "queue1" 
          }, 
          "status" : "waiting", 
          "ts" : { 
           "created" : ISODate("2017-10-29T21:32:59.130+0000"), 
           "started" : null, 
           "done" : null 
          } 
      } 
      

      :

      queue_sources=['queue1','queue2','queue3'] 
      
      for source in queue_sources: 
          collection=jq[source] 
          for item in collection.find({}): 
           schedule_type = item['schedule'] 
           date_last_run = item['ts']['date_last_run'] 
           item['job_type']=source 
      
          if schedule_type=='daily': 
           days=1 
          elif schedule_type=='weekly': 
           days=7 
      
          if date_last_run is None: 
           jobqueue.pub(item) 
      
          elif date_last_run > datetime.now()-timedelta(days=days): 
           jobqueue.pub(item) 
      
          else: 
           module_logger.debug("Job does not meet criteria: ",item) 
           module_logger.debug(" -- schedule type: ",schedule_type) 
           module_logger.debug(" -- date last run: ",date_last_run) 
      
      
      
      def process_schedule(item): 
          proc_dict={"queue1":["s_type1","type1_class","type1_method"] 
             ,"queue2":["s_type2","type2_class","type2_method"] 
             ,"queue3":["s_type3","type3_class","type3_method"] 
             } 
      
          job_type=item['job_type'] 
      
          if job_type in proc_dict.keys(): 
            consumer=[item][job_type][0] 
            consumer_class=[item][job_type][1] 
            consumer_method=[item][job_type][2] 
            from consumer import consumer_class 
      
            ...instantiate class 
      
            ...do stuff with item 
      

      작업은 같을 것 즉시 인스턴스화하고 클래스를 호출하기 위해

    감사합니다.

  • 답변

    0

    비트 더 많은 연구가 폭로 :

    importlib. 
    

    은 따라서이되고 뭔가 같은 :

    if job_type in proc_dict.keys(): 
         consumer=[item][job_type][0] 
         consumer_class=[item][job_type][1] 
         consumer_method=[item][job_type][2] 
    
         imported_class=importlib.__import__(consumer_class) 
         imported_class_instance=imported_class() 
         imported_class_instance.consumer_method(item)