swift服务器中的同步或异步(完美)
我使用完美的框架创建了一个Swift 3.0服务器。一切都像预期的那样好,但我正在努力学习是否有更好的方法来做一些事情 来自iOS的背景,我知道总是在不同的线程中调用任何阻塞函数。在服务器中开发时,这是否仍然有效 例如,如果我有一个长阻塞任务(如发出另一个请求或执行一个大型数据库查询),那么同步调用它是否有区别:swift服务器中的同步或异步(完美),swift,asynchronous,server,swift3,perfect,Swift,Asynchronous,Server,Swift3,Perfect,我使用完美的框架创建了一个Swift 3.0服务器。一切都像预期的那样好,但我正在努力学习是否有更好的方法来做一些事情 来自iOS的背景,我知道总是在不同的线程中调用任何阻塞函数。在服务器中开发时,这是否仍然有效 例如,如果我有一个长阻塞任务(如发出另一个请求或执行一个大型数据库查询),那么同步调用它是否有区别: routes.add(method: .get, uri: "/", handler: { request, response in longSynchronousTask()
routes.add(method: .get, uri: "/", handler: { request, response in
longSynchronousTask()
response.appendBody(string: "Finished")
response.completed()
})
或者我应该异步执行此操作
routes.add(method: .get, uri: "/", handler: { request, response in
longAsynchronousTask(completion: {
response.appendBody(string: "Finished")
response.completed()
})
})
取决于框架。我无法找到有关perfect.org架构的更多信息,但由于它声称在“高性能异步网络引擎”上运行,因此期望处理请求的线程不会阻塞 大多数反应式框架(如Node.js、Vert.x)依赖于处理请求的一个或多个事件线程。 如果这些线程阻塞,则无法处理更多请求 这意味着运行时间较长的任务应该在它们自己的线程中运行。 有一些框架为此提供了一种机制(比如工作线程) 接下来的问题是:什么是长时间运行的任务? 如果您的任务以异步方式执行I/O,并且仅“等待”I/O,那么您可以在事件线程上执行该操作
如果你做了很长时间的计算,你最好把它放到一个单独的线程中。是的,你可以。我使用下面的代码测试,没问题
struct DBOperationQueue {
static let messageOperationQueue:OperationQueue = {
let operationQueue = OperationQueue()
operationQueue.maxConcurrentOperationCount = 5
return operationQueue
}()
}
func handler(request: HTTPRequest, response: HTTPResponse) {
DBOperationQueue.messageOperationQueue.addOperation {
sleep(10)
print("sleep complete")
response.setHeader(.contentType, value: "text/html")
response.appendBody(string: "<html><title>Hello, world!</title><body>Hello, world!</body></html>")
response.completed()
}
}
struct DBOperationQueue{
静态let messageOperationQueue:OperationQueue={
让operationQueue=operationQueue()
operationQueue.maxConcurrentOperationCount=5
返回操作队列
}()
}
func处理程序(请求:HTTPRequest,响应:HTTPResponse){
DBOperationQueue.messageOperationQueue.addOperation{
睡眠(10)
打印(“睡眠完成”)
response.setHeader(.contentType,值:“text/html”)
appendBody(字符串:“你好,世界!你好,世界!”)
答复.已完成()
}
}
一般来说,最好异步运行时间密集型任务和大多数其他任务,以便在处理这些任务时可以做其他事情。除非您需要一系列的任务(按顺序)执行,否则我会异步执行。我相信这条规则还有其他例外,但我想不出有什么例外。话虽如此,我绝对不是服务器端开发方面的专家,所以我可能是错的。但通常情况下,异步执行是您希望在不了解更多程序的情况下执行的方式。