[swift-server-dev] Next HTTP API meeting
Helge Heß
me at helgehess.eu
Wed Mar 29 12:53:54 CDT 2017
On 29. Mar 2017, at 19:14, Johannes Weiß <johannesweiss at apple.com> wrote:
>> And we didn’t even discuss body streams yet, which I still find much more interesting due to the implications they can have on the I/O model :-) Paulo already mentioned the possible need for two APIs (async/sync), which matches my experience.
>
> As per my email where I sketch what we use internally, we only have an async API. We have higher-level stuff on that and some does actually have sync APIs but why do you think we need both a sync and an async API? If someone wants a sync web framework, that's pretty simple to put on top of an async API.
I’ve been thinking a lot about that lately (since well, one of my projects Noze.io is async to the core while my other, mod_swift, is completely sync for practical purposes). I do not think that it is easy at all to put a sync API on top of an async one. But maybe you can enlighten me :-)
Yes, you can use a DispatchSemaphore to serialise the access and make GCD stuff work within sync environments, but as far as I can see this can’t be done in an automagic way right now. It would be cool if GCD would support that, something like a DispatchMain(), but more like WaitForEverythingScheduledFromThisThread().
The other thing is that async (not NIO) essentially requires @escaping closures while sync stuff often doesn’t. @escaping is a pretty big big overhead.
You can have the same user-facing API, like:
readFile(“/etc/passwd”) { data in
}
but in a sync framework that would be
func readFile(_ p: String, cb: (Data)->Void)
in an async framework it would be
func readFile(_ p: String, cb: @escaping (Data)->Void)
Would be trivial with a #define in C, but due to the excellence of Swift, this is not that easy to do w/o copying large amounts of code ;-> (apart from always doing @escaping and live with copying the stack to the heap, adding ARC etc, which is plain lame).
Plus the error reporting issue (throws vs (error, result)).
> So I'd argue we should only have an async API for the HTTP stuff this group proposes.
That sounds OK to *me*. If people want to do other stuff, they still can (libmill and such), it will just perform worse ...
hh
More information about the swift-server-dev
mailing list