def main(): if '--test' in sys.argv or '-t' in sys.argv: test() CommonLog.print_welcome().print_configs() App.run_check() User.run() Query.run() if not Const.IS_TEST: while True: sleep(10000) CommonLog.print_test_complete()
def main(): load_argvs() CommonLog.print_welcome() App.run() CommonLog.print_configs() App.did_start() App.run_check() User.run() Query.run() if not Const.IS_TEST: while True: sleep(10000) else: if Config().is_cluster_enabled(): stay_second(5) # 等待接受完通知 CommonLog.print_test_complete()
def users(): """ 用户任务列表 :return: """ jobs = User().users result = list(map(convert_job_to_info, jobs)) return jsonify(result)
def user_job_destroy(self, data={}, callback=False): from py12306.user.user import User if Config().is_cluster_enabled() and not callback: return self.cluster.publish_event(self.KEY_JOB_DESTROY, data) # 通知其它节点退出 user = User.get_user(data.get('key')) if user: user.destroy()
def check_passengers(self): if not self.passengers: QueryLog.add_quick_log(QueryLog.MESSAGE_CHECK_PASSENGERS.format(self.job_name)).flush() passengers = User.get_passenger_for_members(self.members, self.account_key) if passengers: self.set_passengers(passengers) else: # 退出当前查询任务 self.destroy() return True
def handle_seats(self, allow_seats, ticket_info): for seat in allow_seats: # 检查座位是否有票 self.set_seat(seat) ticket_of_seat = ticket_info[self.current_seat] if not self.is_has_ticket_by_seat(ticket_of_seat): # 座位是否有效 continue QueryLog.print_ticket_seat_available(left_date=self.get_info_of_left_date(), train_number=self.get_info_of_train_number(), seat_type=seat, rest_num=ticket_of_seat) if not self.is_member_number_valid(ticket_of_seat): # 乘车人数是否有效 if self.allow_less_member: self.member_num_take = int(ticket_of_seat) QueryLog.print_ticket_num_less_than_specified(ticket_of_seat, self) else: QueryLog.add_quick_log( QueryLog.MESSAGE_GIVE_UP_CHANCE_CAUSE_TICKET_NUM_LESS_THAN_SPECIFIED).flush() continue if Const.IS_TEST: return # 检查完成 开始提交订单 QueryLog.print_ticket_available(left_date=self.get_info_of_left_date(), train_number=self.get_info_of_train_number(), rest_num=ticket_of_seat) if User.is_empty(): QueryLog.add_quick_log(QueryLog.MESSAGE_USER_IS_EMPTY_WHEN_DO_ORDER.format(self.retry_time)) return stay_second(self.retry_time) order_result = False user = self.get_user() if not user: QueryLog.add_quick_log(QueryLog.MESSAGE_ORDER_USER_IS_EMPTY.format(self.retry_time)) return stay_second(self.retry_time) lock_id = Cluster.KEY_LOCK_DO_ORDER + '_' + user.key if Config().is_cluster_enabled(): if self.cluster.get_lock(lock_id, Cluster.lock_do_order_time, {'node': self.cluster.node_name}): # 获得下单锁 order_result = self.do_order(user) if not order_result: # 下单失败,解锁 self.cluster.release_lock(lock_id) else: QueryLog.add_quick_log( QueryLog.MESSAGE_SKIP_ORDER.format(self.cluster.get_lock_info(lock_id).get('node'), user.user_name)) stay_second(self.retry_time) # 防止过多重复 else: order_result = self.do_order(user) # 任务已成功 通知集群停止任务 if order_result: Event().job_destroy({'name': self.job_name})
def update_configs_from_remote(self, envs, first=False): if envs == self.envs: return from py12306.query.query import Query from py12306.user.user import User for key, value in envs: if key in self.disallow_update_configs: continue if value != -1: old = getattr(self, key) setattr(self, key, value) if not first: if key == 'USER_ACCOUNTS' and old != value: User().update_user_accounts(auto=True, old=old) elif key == 'QUERY_JOBS' and old != value: Query().update_query_jobs(auto=True) # 任务修改 elif key == 'QUERY_INTERVAL' and old != value: Query().update_query_interval(auto=True)
def dashboard(): """ 状态统计 任务数量,用户数量,查询次数 节点信息(TODO) :return: """ from py12306.log.query_log import QueryLog query_job_count = len(Query().jobs) user_job_count = len(User().users) query_count = QueryLog().data.get('query_count') return jsonify({ 'query_job_count': query_job_count, 'user_job_count': user_job_count, 'query_count': query_count })
def update_user(self): from py12306.user.user import User self.user = User() # if not Const.IS_TEST: 测试模块下也可以从文件中加载用户 self.load_user()
def update_user(self): from py12306.user.user import User self.user = User() self.heartbeat_interval = self.user.heartbeat # if not Const.IS_TEST: 测试模块下也可以从文件中加载用户 self.load_user()
def check_passengers(self): if not self.passengers: QueryLog.add_quick_log(QueryLog.MESSAGE_CHECK_PASSENGERS).flush() self.set_passengers( User.get_passenger_for_members(self.members, self.account_key)) return True