我在Fedora26工作站上使用Python3.6.2。在
下面是一些展示我问题的剪贴簿代码:
编辑:在代码中添加了萨姆·哈特曼的建议。在
import asyncio, json
from autobahn.asyncio.websocket import WebSocketClientProtocol, WebSocketClientFactory
class MyClientProtocol(WebSocketClientProtocol):
def onConnect(self, response):
print(response.peer)
def onOpen(self):
print("open")
self.sendMessage(json.dumps({'command': 'subscribe', 'channel': "1010"}).encode("utf8"))
def onMessage(self, payload, isBinary):
print("message")
print(json.loads(payload))
factory1 = WebSocketClientFactory("wss://api2.poloniex.com:443")
factory1.protocol = MyClientProtocol
loop1 = asyncio.get_event_loop()
loop1.run_until_complete(loop1.create_connection(factory1, "api2.poloniex.com", 443, ssl=True))
try:
loop1.run_forever()
except keyboardInterrupt:
pass
loop1.close()
asyncio.set_event_loop(asyncio.new_event_loop())
factory2 = WebSocketClientFactory("wss://api2.poloniex.com:443")
factory2.protocol = MyClientProtocol
loop2 = asyncio.get_event_loop()
loop2.run_until_complete(loop2.create_connection(factory2, "api2.poloniex.com", 443, ssl=True))
try:
loop2.run_forever()
except KeyboardInterrupt:
pass
loop2.close()
关闭初始异步事件循环后,创建另一个并将其设置为全局事件循环后,尝试使用新的事件循环会产生以下错误:
^{pr2}$在关闭之前的事件循环之后,可能需要重新打开事件循环,这似乎是合理的。实际上,这个问题甚至说明了如何:Asyncio Event Loop is Closed
下面的代码应该实现这一点:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
所以我显然做错了什么。有人能看到丢失的东西吗?在
我非常确信您的工厂对象正在维护一个对旧事件循环的引用,大概是它从
asyncio.get_event_loop
获得的。异步使用者不擅长获取对循环的隐藏引用。在我的建议是在关闭循环后重建web套接字工厂
相关问题 更多 >
编程相关推荐