为啥后台线程用不了flask_sqlalchemy

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥后台线程用不了flask_sqlalchemy相关的知识,希望对你有一定的参考价值。

我用socketio.start_background_task开启了一个后台任务,在任务函数中要用到数据库查找,然而发现报错,意思就是没有找到数据库的连接,这是怎么回事?

可以这样做啊。你在flaskapp启动前开一个线程,我过去就是这么做的。

在比如你建立一个thread, 那么在下面这句话前面启动就可以了
1app.run(host="0.0.0.0", port=8888, threaded=True)
python的线程与操作系统的线程是直接绑定的。不过只有一个解释执行环境,所以受GIL影响。不过多线程仍然效率比微程要高些。flask使用threaded模式,可以支持并发访问。不过你加监控线程只能在app的loop之前启动。

这个与java的tomcat的shceduler的原理是一样的。在主进程启动前开一个监控或者是辅助线程。追问

可以用到了flask_socketio之后就不能用app.run启动了,要用socketio.run,而这个方法没有threaded这个参数

可以用到了flask_socketio之后就不能用app.run启动了,要用socketio.run,而这个方法没有threaded这个参数

参考技术A 我也遇到了这个问题 请问是怎么解决的? 参考技术B 不知道,没有吧

为啥即使在指定返回 - 后台线程到主线程问题后代码也会执行?

【中文标题】为啥即使在指定返回 - 后台线程到主线程问题后代码也会执行?【英文标题】:Why does code execute even after specifying return - background thread to main thread issue?为什么即使在指定返回 - 后台线程到主线程问题后代码也会执行? 【发布时间】:2020-07-19 18:31:30 【问题描述】: 我有一个访问服务器的代码,通过一个名称列表并找到一个与我的查询匹配的名称 我通过将整个服务器请求放在后台线程上来处理错误并使用 throw 语句处理错误(基本上是函数 throws) 当我遇到错误时 - 例如“无法连接到服务器”,throw 语句将被成功调用并在 catch 块中成功捕获。

问题是每当我遇到错误时,我都需要在主线程上更新 UI。我使用 dispatchQueue.main.async 来执行此操作并使用 return 语句。但是 return 语句之后的代码仍然被执行。我做错了什么?

在下面的代码中,.queueNetworkFailed枚举错误情况的catch块被成功调用。但看起来 return 不会停止程序执行代码 在 do - catch 语句之后仍然会被执行。是不是因为主线程错误处理的背景?

    func startConnection()
        getServerTimestamp  (timestamp, error) in
            guard let timestampTemp = timestamp?.dateValue().timeIntervalSince1970 else return
            let timestamp = Int(timestampTemp)
            self.connectButtonPressedTimestamp = timestamp
            
            DispatchQueue.global(qos: .background).async 
                var partnerUid: String?
                self.buildServerQuery()
                
                do 
                    partnerUid = try self.findConnection()
                 catch let error 
                    switch error as? ConnectError
                    case .queueNetworkFail: //CALLED SUCCESSFULLY
                        DispatchQueue.main.async 
                            self.userState = 1
                            return //EXPECT FUNCTION TO STOP HERE BUT...
                        
                    case .queueEmptyAtServer:
                        DispatchQueue.main.async 
                            self.establishState4()
                            return
                        
                    case .queueEmptyAtLocal:
                        DispatchQueue.main.async 
                            self.establishState4()
                            return
                        
                    case .none:
                        DispatchQueue.main.async 
                            self.userState = 1
                            return
                        
                    
                
                
                if let partnerUid = partnerUid //FUNCTION EXECUTION CONTINUES DESPITE RETURN
                    self.finalizeConnection(partnerUid: partnerUid)
                 else 
                    DispatchQueue.main.async 
                        print("Something went wrong")
                        self.userState = 1
                    
                
            
        
    

【问题讨论】:

【参考方案1】:

您正在从 Dispatched Main Queue 中的执行流程中返回。您应该从主队列外部返回以停止当前队列中以下代码的执行。

DispatchQueue.main.async 
    self.userState = 1

return //EXPECT TO STOP HERE...

【讨论】:

感谢您的回答。将尝试并将其标记为正确答案 不客气。它应该工作。您可以通过尝试创建一个函数并从调度队列内部和调度队列外部返回来通过一个简单的示例进行检查。

以上是关于为啥后台线程用不了flask_sqlalchemy的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使在指定返回 - 后台线程到主线程问题后代码也会执行?

从后台线程更新 UI 是一种不好的做法,为啥? [关闭]

核心数据-后台线程中的更新实体会自动更改主线程中的 NSManagedObject 而无需合并-为啥?

Flask 分页的简单用法 / flask_sqlalchemy /无刷新翻转页面(原创)

flask_sqlalchemy模糊查询

为啥后台线程中未处理的异常不会使应用程序域崩溃?