1

我使用 Perfect Framework 创建了一个 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()
    })
})
4

2 回答 2

0

取决于框架。我无法找到有关 perfect.org 架构的更多信息,但由于它声称运行在“高性能异步网络引擎”上,因此预期处理请求的线程不应该阻塞。

大多数反应式框架(如 Node.js、Vert.x)依赖于一个或多个处理请求的事件线程。如果这些线程阻塞,则无法处理更多请求!

这意味着运行时间较长的任务应该在它们自己的线程中运行。有些框架为此提供了一种机制(如工作线程)。

那么问题就变成了:什么是运行时间更长的任务?如果您的任务以异步方式执行 I/O 并且只是“等待”I/O,您可以在事件线程上执行此操作。

如果您进行冗长的计算,最好将其放入单独的线程中。

于 2016-12-30T01:57:30.740 回答
-1

是的你可以。我用下面的代码测试,没问题。

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()
    }
}
于 2018-08-24T03:04:47.467 回答