<div dir="ltr">All,<div><br></div><div>Thanks for all your help thus far. I&#39;ll have some time this weekend to try things out but wanted to let you know that I&#39;m only using Linux-native tools: vim, swift binary from the command line.</div><div><br></div><div>To this end: meaningful error messages, friendly API documentation, comparability to Python / Node / Ruby for interacting with the web etc. are all the things I&#39;m investigating. Apparently a task that&#39;s come up is friendliness around coding around the asynchrony model ;)</div><div><br></div><div>Thanks for the suggestions, I&#39;ll work through them soon and report back.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 27, 2016 at 6:32 PM, Dave Abrahams via swift-users <span dir="ltr">&lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Pasting a reply on behalf of Matt Wright (cc&#39;d):<br>
<br>
&gt; On Oct 27, 2016, at 1:57 PM, Dave Abrahams &lt;<a href="mailto:dabrahams@apple.com">dabrahams@apple.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; From: Steven Harms via swift-users &lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt;<br>
&gt; Subject: [Swift3][Linux][URLSession]: Core dump when trying to make simple HTTP request<br>
...&lt;schnipp 40&gt;...<br>
&gt; Date: October 27, 2016 at 5:01:58 AM PDT<br>
&gt; To: <a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
&gt; Reply-To: Steven Harms &lt;<a href="mailto:sgharms@stevengharms.com">sgharms@stevengharms.com</a>&gt;<br>
<div><div class="h5">&gt;<br>
&gt;<br>
&gt; Hello Swift,<br>
&gt;<br>
&gt; I&#39;ve been trying out Swift as a general utility language on the server (replacing Ruby or Node). I&#39;m trying to write a simple image retriever via HTTP as a learning project.<br>
&gt;<br>
&gt; Inspired by this [gist][], I&#39;ve written the following:<br>
&gt;<br>
&gt; let queue = DispatchQueue.global(qos: .background)<br>
&gt;<br>
&gt; let sessionConfiguration = URLSessionConfiguration.<wbr>default<br>
&gt; let session = URLSession(configuration: sessionConfiguration)<br>
&gt;<br>
&gt; print(&quot;staring sync&quot;)<br>
&gt; queue.async(execute: {<br>
&gt;     print(&quot;&gt;&gt;&gt; [\(queue.label)]: At the queue start&quot;)<br>
&gt;     print(&quot;x&quot;)<br>
&gt;     let task = session.dataTask(with: URL(string: &quot;<a href="http://google.com" rel="noreferrer" target="_blank">http://google.com</a>&quot;)!, completionHandler: {<br>
&gt;         (data, response, error) in<br>
&gt;         print(&quot;Task ran!&quot;)<br>
&gt;     })<br>
&gt;     print(&quot;y&quot;)<br>
&gt;     task.resume()<br>
&gt;     print(&quot;z&quot;)<br>
&gt; })<br>
&gt; print(&quot;ending sync&quot;)<br>
&gt;<br>
&gt; With output:<br>
&gt;<br>
&gt; staring sync<br>
&gt; ending sync<br>
&gt;<br>
&gt; or...<br>
&gt;<br>
&gt; staring sync<br>
&gt; ending sync<br>
&gt; &gt;&gt;&gt; [com.apple.root.background-<wbr>qos]: At the queue start<br>
&gt; x<br>
&gt; y<br>
&gt; y<br>
&gt; z<br>
&gt;<br>
&gt; Whoa.<br>
&gt;<br>
&gt; At this point I&#39;m going to have to confess that I need some help clarifying my model.<br>
&gt;<br>
&gt; 1. How did point &quot;y&quot; get fired twice? Or how did it happen not at all?<br>
<br>
</div></div>The double-fire is something I can’t immediately come up with an<br>
explanation. It might be specific to the Linux dispatch<br>
implementation, which I’m not well versed on but it’s very strange<br>
that it would print twice. Not firing at all is likely because his<br>
snippet of code exited before the work was run on another thread. The<br>
“main” thread here either has to wait for the session work to finish<br>
explicitly, or call dispatch_main() to cede control of the main thread<br>
to the system (and subsequently exit out of the tool somewhere else).<br>
<span class=""><br>
&gt; 2. How did my callback for dataTask *never* fire? Even if the connection task *failed* the handler<br>
ought have fired, no?<br>
<br>
</span>Likely similar to (1), though if URLSession uses runloops (Linux?)<br>
then it could also be because the runloop was never run anywhere. On<br>
Darwin I’d suspect the runloop for URLSession wasn’t running, I don’t<br>
know how it works on Linux.<br>
<span class=""><br>
&gt; 3. I didn&#39;t want to bring this whole queue business into the<br>
&gt; picture, but it appears that without it the program exits before the<br>
&gt; handler has a chance to fire.<br>
<br>
</span>Probably similar to the issues in (1) and (2). If the snippet exits after running then a lot of this<br>
asynchronously scheduled work will never happen.<br>
<span class=""><br>
&gt; 4. Changing to a queue.sync from queue.async consistently produces the output I expect, but does<br>
not fire my completionHandler still.<br>
<br>
</span>This forces the queue.sync to run in-line (on the current thread) but<br>
the snippet will then likely still exit before anything happens to<br>
cause the URLSession to finish.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
-Dave<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
______________________________<wbr>_________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-users</a><br>
</div></div></blockquote></div><br></div>