擅长:python、mysql、java
<p>嘿,三个问题合一!;-)</p>
<p>它有时会阻塞—即使您的服务器生成数据非常快,网络瓶颈理论上也可能导致您的读取阻塞。</p>
<p>使用“for dat in req”读取URL数据意味着一次读取一行数据——如果您读取的是二进制数据,例如图像,则不是真正有用的。如果你使用</p>
<pre><code>chunk = req.read(size)
</code></pre>
<p>当然可以堵住。</p>
<p>这是否是最好的方法取决于你问题中没有的细节。例如,如果需要在运行时不使用任何阻塞调用,则需要考虑像<a href="http://twistedmatrix.com/" rel="noreferrer">Twisted</a>这样的框架。如果你不想阻止你,也不想使用Twisted(这是一个全新的范例,与阻止方式做的事情相比),那么你可以旋转一个线程来读写文件,而你的主线程继续其快乐的方式:</p>
<pre><code>def func(req):
#code the read from URL stream and write to file here
...
t = threading.Thread(target=func)
t.start() # will execute func in a separate thread
...
t.join() # will wait for spawned thread to die
</code></pre>
<p>很明显,我忽略了错误检查/异常处理等,但希望这足以给您提供图片。</p>