【问题标题】:Multi-threading on Google app engineGoogle 应用引擎上的多线程
【发布时间】:2015-10-17 07:18:49
【问题描述】:

Google App 引擎是否支持多线程?我在网络上看到相互矛盾的报告。

基本上,我正在开发一个与 Apple 推送通知服务器 (APNS) 通信的模块。它使用一个工作线程,不断寻找需要在拉取队列中推送到客户端设备的新消息。

在它收到一条消息并将其发送到 APNS 后,我希望它启动另一个线程来检查 APNS 是否发送任何错误响应作为回报。基本上,在同一个套接字上查找传入字节(它只能是每个 APNS 规范的错误响应)。如果自主线程上一次消息发送时间以来的 60 秒内没有任何消息,则错误响应线程终止。

虽然这个“错误响应处理程序”线程正在等待来自 APNS 的字节(使用套接字上的选择),但我希望主线程继续查看拉取队列并发送任何立即到来的数据包。

我尝试启动一个后台线程来执行错误响应处理程序的功能。但这不能按预期工作,因为线程是串行执行的。即只有在错误响应线程完成其 60 秒的等待后,控制才返回到主线程。因此,如果在此期间有消息到达,它们就会进入队列。

我试过 threadsafe: false in .yaml

我的问题是:

  1. 有没有办法在 GAE 中实现真正的多线程。即上例中的主线程和错误响应线程是并行执行的,而不是强制一个等待其他线程执行?

  2. 如果没有,我试图解决的问题是否有任何解决方案?我尝试启动一个新实例来处理错误响应(基本上使用推送队列),但我不知道如何将错误响应线程必须作为参数侦听的套接字对象传递给此推送队列任务(因为不支持 dill 序列化套接字对象)

【问题讨论】:

  • 没有。线程在前端请求中可用,但该请求创建的所有线程都在请求完成时完成,并且您有 60 秒的截止日期。如果您有阻塞操作(即网络数据存储),线程将同时运行。但是,如果您查看大多数 appengine api 允许异步方法。还有其他方法可以实现您想要的。使用任务队列来管理您的拉取队列。 app.yaml 中的 Threadsafe 选项意味着单个实例可以处理并发请求 - 每个请求的线程。

标签: multithreading python-2.7 sockets google-app-engine apple-push-notifications


【解决方案1】:

发现问题。我在调用 start_background_thread 时将参数设置为 function()。当我将其修复为将其称为 function 时,它按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 2014-10-14
    • 1970-01-01
    相关资源
    最近更新 更多