我有一个Python Web应用程序,客户端(Ember.js)通过WebSocket与服务器通信(我正在使用Flask-SocketIO).除了WebSocket服务器之外,后端还有两件值得提及的事情:
当客户端提交图像时,在数据库中创建其实体,并将id放入图像转换队列中.工人抓住它并进行图像转换.之后,工作人员将其放入OCR队列,在那里它将由OCR队列工作者处理.
到现在为止还挺好.WS请求在不同的线程中同步处理(Flask-SocketIO使用Eventlet),并且繁重的计算操作异步发生(在单独的线程中也是如此).
现在问题是:整个应用程序在Raspberry Pi 3上运行.如果我没有使用它的4核,我只有一个主频为1.2 GHz的ARMv8内核.这对于OCR来说是非常小的力量.所以我决定了解如何在Python中使用多个内核.虽然我读到了GIL的问题但是我发现了多处理的地方The multiprocessing package offers both local and remote concurrency, effectively side-stepping the Global Interpreter Lock by using subprocesses instead of threads..正是我想要的.所以我立即取代了
from threading import Thread
thread = Thread(target=heavy_computational_worker_thread)
thread.start()
Run Code Online (Sandbox Code Playgroud)
通过
from multiprocessing import Process
process = Process(target=heavy_computational_worker_thread)
process.start()
Run Code Online (Sandbox Code Playgroud)
队列需要由多个核心处理,所以我不得不改变
from queue import Queue
queue = multiprocessing.Queue()
Run Code Online (Sandbox Code Playgroud)
至
import multiprocessing
queue = multiprocessing.Queue()
Run Code Online (Sandbox Code Playgroud)
同样.有问题:队列和线程库由Eventlet …
python multithreading multiprocessing eventlet flask-socketio
这听起来像是一个微不足道的任务,但我找不到解决这个问题的正确方法。可能我还没有内化“SwiftUI-ish”的思维方式。
我有一个带有按钮的视图。当视图加载时,有一个条件(已经登录?),在该条件下视图应该直接转到下一个视图。如果单击该按钮,则会触发 API 调用(登录),如果成功,还会重定向到下一个视图。
我的尝试是建立一个模型(ObservableObject)来保存变量“shouldRedirectToUploadView”,它是一个 PassThroughObject。一旦满足视图中的 onAppear 条件或单击按钮(并且 API 调用成功),该变量就会翻转为 true 并告诉观察者更改视图。
翻转模型中的“shouldRedirectToUploadView”似乎有效,但我无法使视图重新评估该变量,因此新视图将无法打开。
这是到目前为止我的实现:
该模型
import SwiftUI
import Combine
class SboSelectorModel: ObservableObject {
var didChange = PassthroughSubject<Void, Never>()
var shouldRedirectToUpdateView = false {
didSet {
didChange.send()
}
}
func fetch(_ text: String) {
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
self.shouldRedirectToUpdateView = true
}
}
}
Run Code Online (Sandbox Code Playgroud)
风景
import SwiftUI
struct SboSelectorView: View {
@State var text: String = ""
@ObservedObject var model: SboSelectorModel
var body: some View {
return ZStack {
if …Run Code Online (Sandbox Code Playgroud) 我的情况如下:我有一个 SwiftUI 应用程序,想要显示一个 WebView。当用户点击该 WebView 中的某个按钮时,我希望用户被重定向到下一个 (SwiftUI) 视图。我使用 UIViewRepresentable ,因为这似乎是在 SwiftUI 中显示 WebView 的当前方式,因为它是 UIKit 的桥梁。问题是: UIViewRepresentable 没有body。那么我在哪里告诉视图切换?在通常的 SwiftUI 视图中,我会更新一个模型,然后对主体中的模型更改做出反应。
我设置了一个示例,其中在 WebView 中呈现https://www.google.com。当用户发送搜索查询时,协调器被调用,它调用 UIViewRepresentable 的函数:
视图- 这是应该通过显示另一个视图(使用NavigationLinks实现)对模型更改做出反应的视图
import SwiftUI
struct WebviewContainer: View {
@ObservedObject var model: WebviewModel = WebviewModel()
var body: some View {
return NavigationView {
VStack {
NavigationLink(destination: LoginView(), isActive: $model.loggedOut) {
EmptyView()
}.isDetailLink(false)
.navigationBarTitle(Text(""))
.navigationBarHidden(self.model.navbarHidden)
NavigationLink(destination: CameraView(model: self.model), isActive: $model.shouldRedirectToCameraView) {
EmptyView()
}
.navigationBarTitle(Text(""))
.navigationBarHidden(self.model.navbarHidden)
Webview(model: self.model)
}
}
} …Run Code Online (Sandbox Code Playgroud) 我写了一个Ember组件,它代表一个可以处理文件上传的样式输入字段.为了达到这个目的,我使用了a <div>和a <input>.在<input>有visibility: hidden一次的单击事件<div>被激发我火上无形的单击事件<input>在灰烬组件的动作处理.
我的问题是,在选择文件后,操作永远不会到达我的Ember组件.
附加文档input.hbs
<div {{action "add"}} class="floating-button">
<span>+</span>
</div>
{{input multiple="true" action="upload" on="change" accept="image/png,image/jpeg,application/pdf" type="file"}}
Run Code Online (Sandbox Code Playgroud)
附加文档input.js
import Ember from 'ember';
export default Ember.Component.extend({
actions: {
upload() {
console.log('This never happens');
},
add() {
Ember.$("input[type='file']").click();
}
}
});
Run Code Online (Sandbox Code Playgroud)
我想这与我触发动作中的click事件有关.这样第二次动作在视图中发生时就不会到达组件.
Ember版本:2.7.0