从SQS读取Python多处理

从SQS读取Python多处理,python,amazon-web-services,multiprocessing,message-queue,amazon-sqs,Python,Amazon Web Services,Multiprocessing,Message Queue,Amazon Sqs,下面的代码启动了多个python进程,这些进程不断地从SQS队列轮询 这些过程是通过以下方式启动的: num_processes = range(1, 9) for p_num in num_processes: p = multiprocessing.Process( target=sqs_polling, args=(queue_name, p_num,)) p.start() 而实际的轮询函数是 def sqs_polli

下面的代码启动了多个python进程,这些进程不断地从SQS队列轮询

这些过程是通过以下方式启动的:

num_processes = range(1, 9)

    for p_num in num_processes:
        p = multiprocessing.Process(
            target=sqs_polling, args=(queue_name, p_num,))
        p.start()
而实际的轮询函数是

def sqs_polling(queue_name, process_id):

    sqs = boto3.resource('sqs', region_name='us-east-1')
    queue = sqs.get_queue_by_name(QueueName=queue_name)

    no_messages = False

    # poll sqs forever
    while 1:

        # polling delay so aws does not throttle us
        sleep(2.0)

        # sleep longer if there are no messages on the queue the last time it was polled
        if no_messages:
            sleep(900.0)

        message_batch = queue.receive_messages(MaxNumberOfMessages=10, WaitTimeSeconds=20)

        if len(message_batch) == 0:
            no_messages = True
        else:
            no_messages = False

        # process messages
        for message in message_batch:
            do_something(message)
            message.delete()

这似乎可以工作几个小时,但最终似乎SQS限制了进程,并且即使消息存在于队列中,也无法读取任何消息。为了帮助减少这种情况,我在队列读取之间有2秒的超时时间。此外,我还创建了一个15分钟的超时,如果没有消息读取。尽管如此,我还是感到窒息。有人能解释为什么节流还在这里发生吗?另一种可能是与队列的连接变得陈旧,但我认为这不太可能。

这个问题有点过时,但我刚刚发布了一个高级多线程方法,可以从Python代码中侦听多个SQS队列

导入时间 从multi_sqs_侦听器导入QueueConfig、EventBus、MultiSQSListener 类MyListenerMultiSQSListener: def低优先级作业本身,消息: 打印“正在启动低优先级、长作业:{}”。格式化消息 时间到了 打印“已结束的低优先级作业:{}”。格式化消息 def高优先级作业本身,消息: 打印“正在启动高优先级快速作业:{}”。格式化消息 时间,睡觉 打印“已结束的高优先级作业:{}”。格式化消息 def handle_messageself、队列、总线、优先级、消息: 如果总线==“高优先级总线”: self.high\u priority\u jobmessage.body 其他: self.low\u priority\u jobmessage.body 低优先级总线=事件总线“低优先级总线”,优先级=1 高优先级总线=事件总线“高优先级总线”,优先级=5 EventBus.register_总线[低优先级_总线,高优先级_总线] 低优先级队列=队列配置“低优先级队列”,低优先级总线 高优先级队列=队列配置“高优先级队列”,高优先级总线 my_listener=MyListener[低优先级队列,高优先级队列] 我的听众,听着
没有必要使用sleep2.0。除非您实际上得到了指示节流的错误(您没有提到),否则这并不是发生的事情——我的SQS代码根本没有休眠。控制台主页面中显示的队列中的消息。。。他们有空还是在飞行中?另外,message.delete不返回值吗?队列的CloudWatch计数器显示了什么?因为没有错误,我认为它不是节流。实际上根本没有错误。这些进程在几个小时后就会停止做任何事情,即使它们处于一个应该不断轮询的while循环中。我完全不知道发生了什么。虽然我使用了很多AWS服务,但没有一个是Python。。。但如果所有其他方法都失败了,请添加更多日志记录。记录循环每次迭代的时间和进程id。他们还在投票吗?他们在跑吗?他们被吊死了吗?终止?我在while循环中有日志。所以它一定是挂在那个圈的某个地方。他们还没有投票。非常令人沮丧,我在这里没有看到任何会导致日志记录发生的情况。在消息\u batch=queue之前和之后添加内容。接收\u消息。。。之前开始轮询,之后完成轮询,以及时间戳和进程ID。如果它每20秒正确记录一次启动和完成,那么您有理由怀疑SQS有故障。。。但是如果它停止记录,不管最后记录的是哪条消息,都会告诉你在循环中哪里出了问题。