<p>正如我从<code>traceback</code>中看到的,我们只到达第2步,共4步</p>
<blockquote>
<p>From the <strong>asyncio</strong> docs:<br/>
This module provides infrastructure for writing single-threaded concurrent code using coroutines, multiplexing I/O access over sockets and other resources </p>
</blockquote>
<p>因此,我放弃了我的第一个建议使用<code>multithreading</code>。<br/>
我可以想象以下三种选择:</p>
<ol>
<li>用<code>multiprocessing</code>代替<code>multithreading</code></li>
<li>用<code>coroutine</code>在<code>asyncio loop</code>内完成</li>
<li>在<code>def onJoin(self, details)</code>中的<code>channels</code>之间切换</li>
</ol>
<hr/>
<p>第二个建议,第一个选项使用<code>multiprocessing</code>。<br/>
我可以启动两个<code>asyncio loops</code>,所以<code>appRunner.run(...)</code>应该可以工作。在</p>
<p>如果<code>channel</code>是唯一不同的,那么可以使用一个</strong><code>class ApplicationSession</code>。
如果需要传递不同的<code>class ApplicationSession</code>,请将其添加到<code>args=</code></p>
<pre><code>class __ApplicationSession(ApplicationSession):
# ...
try:
yield from self.subscribe(onTicker, self.config.extra['channel'])
except Exception as e:
# ...
import multiprocessing as mp
import time
def ApplicationRunner_process(realm, channel):
appRunner = ApplicationRunner("wss://api.poloniex.com:443", realm, extra={'channel': channel})
appRunner.run(__ApplicationSession)
if __name__ == "__main__":
AppRun = [{'process':None, 'channel':'BTC_LTC'},
{'process': None, 'channel': 'BTC_XMR'}]
for app in AppRun:
app['process'] = mp.Process(target = ApplicationRunner_process, args = ('realm1', app['channel'] ))
app['process'].start()
time.sleep(0.1)
AppRun[0]['process'].join()
AppRun[1]['process'].join()
</code></pre>