def multi_processing_consume(): get_consumer('task1_queue', consuming_function=task1, broker_kind=2).start_consuming_message() RedisConsumer('task2_queue', consuming_function=task2, threads_num=100).start_consuming_message() AbstractConsumer.join_shedual_task_thread( ) # linux多进程启动时候一定要加这一句,否则即使是while 1 的线程如果不join,子进程也会迅速退出。windows下可以不需要这一句。
def get_consumer( queue_name, *, consuming_function: Callable = None, function_timeout=0, threads_num=50, specify_threadpool=None, concurrent_mode=1, max_retry_times=3, log_level=10, is_print_detail_exception=True, msg_schedule_time_intercal=0.0, qps=0, msg_expire_senconds=0, logger_prefix='', create_logger_file=True, do_task_filtering=False, is_consuming_function_use_multi_params=True, is_do_not_run_by_specify_time_effect=False, do_not_run_by_specify_time=('10:00:00', '22:00:00'), schedule_tasks_on_main_thread=False, function_result_status_persistance_conf=FunctionResultStatusPersistanceConfig( False, False, 7 * 24 * 3600), broker_kind=0): """ 使用工厂模式再包一层,通过设置数字来生成基于不同中间件或包的consumer。 :param queue_name: 队列名字。 :param consuming_function: 处理消息的函数。 指定队列名字和指定消费函数这两个参数是必传,必须指定, 这2个是这个消费框架的本质核心参数,其他参数都是可选的。 :param function_timeout : 超时秒数,函数运行超过这个时间,则自动杀死函数。为0是不限制。 :param threads_num:并发数量,协程或线程。由concurrent_mode决定并发种类。 :param specify_threadpool:使用指定的线程池(协程池),可以多个消费者共使用一个线程池,不为None时候。threads_num失效 :param concurrent_mode:并发模式,1线程 2gevent 3eventlet :param max_retry_times: 最大自动重试次数,当函数发生错误,立即自动重试运行n次,对一些特殊不稳定情况会有效果。 可以在函数中主动抛出重试的异常ExceptionForRetry,框架也会立即自动重试。 主动抛出ExceptionForRequeue异常,则当前消息会重返中间件。 :param log_level:框架的日志级别。 :param is_print_detail_exception:是否打印详细的堆栈错误。为0则打印简略的错误占用控制台屏幕行数少。 :param msg_schedule_time_intercal:消息调度的时间间隔,用于控频的关键。 :param qps:指定1秒内的函数执行次数,qps会覆盖msg_schedule_time_intercal,以后废弃msg_schedule_time_intercal这个参数。 :param msg_expire_senconds:消息过期时间,为0永不过期,为10则代表,10秒之前发布的任务如果现在才轮到消费则丢弃任务。 :param logger_prefix: 日志前缀,可使不同的消费者生成不同的日志 :param create_logger_file : 是否创建文件日志 :param do_task_filtering :是否执行基于函数参数的任务过滤 :param is_consuming_function_use_multi_params 函数的参数是否是传统的多参数,不为单个body字典表示多个参数。 :param is_do_not_run_by_specify_time_effect :是否使不运行的时间段生效 :param do_not_run_by_specify_time :不运行的时间段 :param schedule_tasks_on_main_thread :直接在主线程调度任务,意味着不能直接在当前主线程同时开启两个消费者。 :param function_result_status_persistance_conf :配置。是否保存函数的入参,运行结果和运行状态到mongodb。 这一步用于后续的参数追溯,任务统计和web展示,需要安装mongo。 :param broker_kind:中间件种类,。 0 使用pika链接rabbitmqmq,1使用rabbitpy包实现的操作rabbitmnq,2使用redis, 3使用python内置Queue,4使用amqpstorm包实现的操作rabbitmq,5使用mongo,6使用sqlite。 7使用nsq,8使用kafka,9也是使用redis但支持消费确认。 :return AbstractConsumer """ all_kwargs = copy.copy(locals()) all_kwargs.pop('broker_kind') if broker_kind == 0: return RabbitmqConsumer(**all_kwargs) elif broker_kind == 1: return RabbitmqConsumerRabbitpy(**all_kwargs) elif broker_kind == 2: return RedisConsumer(**all_kwargs) elif broker_kind == 3: return LocalPythonQueueConsumer(**all_kwargs) elif broker_kind == 4: return RabbitmqConsumerAmqpStorm(**all_kwargs) elif broker_kind == 5: return MongoMqConsumer(**all_kwargs) elif broker_kind == 6: return PersistQueueConsumer(**all_kwargs) elif broker_kind == 7: return NsqConsumer(**all_kwargs) elif broker_kind == 8: return KafkaConsumer(**all_kwargs) elif broker_kind == 9: return RedisConsumerAckAble(**all_kwargs) else: raise ValueError('设置的中间件种类数字不正确')
def get_consumer(queue_name, *, consuming_function: Callable = None, function_timeout=0, threads_num=50, concurrent_num=50, specify_threadpool=None, concurrent_mode=1, max_retry_times=3, log_level=10, is_print_detail_exception=True, msg_schedule_time_intercal=0.0, qps: float = 0, msg_expire_senconds=0, is_using_distributed_frequency_control=False, logger_prefix='', create_logger_file=True, do_task_filtering=False, task_filtering_expire_seconds=0, is_consuming_function_use_multi_params=True, is_do_not_run_by_specify_time_effect=False, do_not_run_by_specify_time=('10:00:00', '22:00:00'), schedule_tasks_on_main_thread=False, function_result_status_persistance_conf=FunctionResultStatusPersistanceConfig(False, False, 7 * 24 * 3600), is_using_rpc_mode=False, broker_kind=0): """ 使用工厂模式再包一层,通过设置数字来生成基于不同中间件或包的consumer。 :param queue_name: 队列名字。 :param consuming_function: 处理消息的函数。 指定队列名字和指定消费函数这两个参数是必传,必须指定, 这2个是这个消费框架的本质核心参数,其他参数都是可选的。 :param function_timeout : 超时秒数,函数运行超过这个时间,则自动杀死函数。为0是不限制。 :param threads_num:并发数量,协程或线程。由concurrent_mode决定并发种类。 :param concurrent_num:并发数量,这个覆盖threads_num。以后会废弃threads_num参数,因为表达的意思不太准确,不一定是线程模式并发。 :param specify_threadpool:使用指定的线程池(协程池),可以多个消费者共使用一个线程池,不为None时候。threads_num失效 :param concurrent_mode:并发模式,1线程 2gevent 3eventlet :param max_retry_times: 最大自动重试次数,当函数发生错误,立即自动重试运行n次,对一些特殊不稳定情况会有效果。 可以在函数中主动抛出重试的异常ExceptionForRetry,框架也会立即自动重试。 主动抛出ExceptionForRequeue异常,则当前消息会重返中间件。 :param log_level:框架的日志级别。 :param is_print_detail_exception:是否打印详细的堆栈错误。为0则打印简略的错误占用控制台屏幕行数少。 :param msg_schedule_time_intercal:消息调度的时间间隔,用于控频的关键。 :param qps:指定1秒内的函数执行次数,qps会覆盖msg_schedule_time_intercal,以后废弃msg_schedule_time_intercal这个参数。 :param msg_expire_senconds:消息过期时间,为0永不过期,为10则代表,10秒之前发布的任务如果现在才轮到消费则丢弃任务。 :param is_using_distributed_frequency_control: 是否使用分布式空频(依赖redis计数),默认只对当前实例化的消费者空频有效。假如实例化了2个qps为10的使用同一队列名的消费者, 并且都启动,则每秒运行次数会达到20。如果使用分布式空频则所有消费者加起来的总运行次数是10。 :param logger_prefix: 日志前缀,可使不同的消费者生成不同的日志 :param create_logger_file : 是否创建文件日志 :param do_task_filtering :是否执行基于函数参数的任务过滤 :param task_filtering_expire_seconds:任务过滤的失效期,为0则永久性过滤任务。例如设置过滤过期时间是1800秒 , 30分钟前发布过1 + 2 的任务,现在仍然执行, 如果是30分钟以内发布过这个任务,则不执行1 + 2,现在把这个逻辑集成到框架,一般用于接口价格缓存。 :param is_consuming_function_use_multi_params 函数的参数是否是传统的多参数,不为单个body字典表示多个参数。 :param is_do_not_run_by_specify_time_effect :是否使不运行的时间段生效 :param do_not_run_by_specify_time :不运行的时间段 :param schedule_tasks_on_main_thread :直接在主线程调度任务,意味着不能直接在当前主线程同时开启两个消费者。 :param function_result_status_persistance_conf :配置。是否保存函数的入参,运行结果和运行状态到mongodb。 这一步用于后续的参数追溯,任务统计和web展示,需要安装mongo。 :param is_using_rpc_mode 是否使用rpc模式,可以在发布端获取消费端的结果回调,但消耗一定性能,使用async_result.result时候会等待阻塞住当前线程。。 :param broker_kind:中间件种类,。 0 使用pika链接rabbitmqmq,1使用rabbitpy包实现的操作rabbitmnq,2使用redis, 3使用python内置Queue,4使用amqpstorm包实现的操作rabbitmq,5使用mongo,6使用本机磁盘持久化。 7使用nsq,8使用kafka,9也是使用redis但支持消费确认。10为sqlachemy,支持mysql sqlite postgre oracel sqlserver :return AbstractConsumer """ all_kwargs = copy.copy(locals()) all_kwargs.pop('broker_kind') if broker_kind == 0: return RabbitmqConsumer(**all_kwargs) elif broker_kind == 1: return RabbitmqConsumerRabbitpy(**all_kwargs) elif broker_kind == 2: return RedisConsumer(**all_kwargs) elif broker_kind == 3: return LocalPythonQueueConsumer(**all_kwargs) elif broker_kind == 4: return RabbitmqConsumerAmqpStorm(**all_kwargs) elif broker_kind == 5: return MongoMqConsumer(**all_kwargs) elif broker_kind == 6: return PersistQueueConsumer(**all_kwargs) elif broker_kind == 7: return NsqConsumer(**all_kwargs) elif broker_kind == 8: return KafkaConsumer(**all_kwargs) elif broker_kind == 9: return RedisConsumerAckAble(**all_kwargs) elif broker_kind == 10: return SqlachemyConsumer(**all_kwargs) else: raise ValueError('设置的中间件种类数字不正确')
def get_consumer(queue_name, *, consuming_function: Callable = None, function_timeout=0, threads_num=50, specify_threadpool=None, concurrent_mode=1, max_retry_times=3, log_level=10, is_print_detail_exception=True, msg_schedule_time_intercal=0.0, msg_expire_senconds=0, logger_prefix='', create_logger_file=True, do_task_filtering=False, is_consuming_function_use_multi_params=True, is_do_not_run_by_specify_time_effect=False, do_not_run_by_specify_time=('10:00:00', '22:00:00'), schedule_tasks_on_main_thread=False, broker_kind=0): """ 使用工厂模式再包一层,通过设置数字来生成基于不同中间件或包的consumer。 :param queue_name: :param consuming_function: 处理消息的函数。 :param function_timeout : 超时秒数,函数运行超过这个时间,则自动杀死函数。为0是不限制。 :param threads_num:并发数量,协程或线程。由concurrent_mode决定并发种类。 :param specify_threadpool:使用指定的线程池(协程池),可以多个消费者共使用一个线程池,不为None时候。threads_num失效 :param concurrent_mode:并发模式,1线程 2gevent 3eventlet :param max_retry_times: 最大自动重试次数,当函数发生错误,立即自动重试运行n次,对一些特殊不稳定情况会有效果。 可以在函数中主动抛出重试的异常ExceptionForRetry,框架也会立即自动重试。 主动抛出ExceptionForRequeue异常,则当前消息会重返中间件。 :param log_level:框架的日志级别。 :param is_print_detail_exception:是否打印详细的堆栈错误。为0则打印简略的错误占用控制台屏幕行数少。 :param msg_schedule_time_intercal:消息调度的时间间隔,用于控频的关键。 :param msg_expire_senconds:消息过期时间,为0永不过期,为10则代表,10秒之前发布的任务如果现在才轮到消费则丢弃任务。 :param logger_prefix: 日志前缀,可使不同的消费者生成不同的日志 :param create_logger_file : 是否创建文件日志 :param do_task_filtering :是否执行基于函数参数的任务过滤 :param is_consuming_function_use_multi_params 函数的参数是否是传统的多参数,不为单个body字典表示多个参数。 :param is_do_not_run_by_specify_time_effect :是否使不运行的时间段生效 :param do_not_run_by_specify_time :不运行的时间段 :param schedule_tasks_on_main_thread :直接在主线程调度任务,意味着不能直接在当前主线程同时开启两个消费者。 :param broker_kind:中间件种类,。 0 使用pika链接mq,2使用redis,3使用python内置Queue,5使用mongo,6使用sqlite。 :return """ all_kwargs = copy.copy(locals()) all_kwargs.pop('broker_kind') if broker_kind == 0: return RabbitmqConsumer(**all_kwargs) elif broker_kind == 1: return RabbitmqConsumerRabbitpy(**all_kwargs) elif broker_kind == 2: return RedisConsumer(**all_kwargs) elif broker_kind == 3: return LocalPythonQueueConsumer(**all_kwargs) elif broker_kind == 4: return RabbitmqConsumerAmqpStorm(**all_kwargs) elif broker_kind == 5: return MongoMqConsumer(**all_kwargs) elif broker_kind == 6: return PersistQueueConsumer(**all_kwargs) else: raise ValueError('设置的中间件种类数字不正确')