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 など) は、リクエストを処理する 1 つまたは複数のイベント スレッドに依存しています。これらのスレッドがブロックされると、それ以上リクエストを処理できなくなります。

つまり、実行時間の長いタスクは、独自のスレッドで実行する必要があります。そのためのメカニズムを提供するフレームワークがあります (ワーカースレッドなど)。

質問は次のようになります。実行時間の長いタスクとは何ですか? タスクが非同期方式で I/O を実行し、単に I/O を「待機」する場合は、イベント スレッドで実行できます。

長い計算を行う場合は、別のスレッドに入れたほうがよい場合があります。

于 2016-12-30T01:57:30.740 に答える