swift服务器中的同步或异步(完美)

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()

我使用完美的框架创建了一个Swift 3.0服务器。一切都像预期的那样好,但我正在努力学习是否有更好的方法来做一些事情

来自iOS的背景,我知道总是在不同的线程中调用任何阻塞函数。在服务器中开发时,这是否仍然有效

例如,如果我有一个长阻塞任务(如发出另一个请求或执行一个大型数据库查询),那么同步调用它是否有区别:

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(字符串:“你好,世界!你好,世界!”)
答复.已完成()
}
}

一般来说,最好异步运行时间密集型任务和大多数其他任务,以便在处理这些任务时可以做其他事情。除非您需要一系列的任务(按顺序)执行,否则我会异步执行。我相信这条规则还有其他例外,但我想不出有什么例外。话虽如此,我绝对不是服务器端开发方面的专家,所以我可能是错的。但通常情况下,异步执行是您希望在不了解更多程序的情况下执行的方式。