remove main queue completely
This commit is contained in:
parent
659c8c237f
commit
d713af045f
@ -148,7 +148,8 @@ async def message_endpoint(
|
|||||||
channel_broadcaster(channel, message_stream)
|
channel_broadcaster(channel, message_stream)
|
||||||
)
|
)
|
||||||
await channel_tasks
|
await channel_tasks
|
||||||
|
except WebSocketChannelClosed:
|
||||||
|
pass
|
||||||
finally:
|
finally:
|
||||||
logger.info(f"Channel disconnected - {channel}")
|
logger.info(f"Channel disconnected - {channel}")
|
||||||
channel_tasks.cancel()
|
channel_tasks.cancel()
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import asyncio
|
|
||||||
import logging
|
import logging
|
||||||
from ipaddress import IPv4Address
|
from ipaddress import IPv4Address
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
@ -7,15 +6,12 @@ import orjson
|
|||||||
import uvicorn
|
import uvicorn
|
||||||
from fastapi import Depends, FastAPI
|
from fastapi import Depends, FastAPI
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
# Look into alternatives
|
|
||||||
from janus import Queue as ThreadedQueue
|
|
||||||
from starlette.responses import JSONResponse
|
from starlette.responses import JSONResponse
|
||||||
|
|
||||||
from freqtrade.constants import Config
|
from freqtrade.constants import Config
|
||||||
from freqtrade.exceptions import OperationalException
|
from freqtrade.exceptions import OperationalException
|
||||||
from freqtrade.rpc.api_server.uvicorn_threaded import UvicornServer
|
from freqtrade.rpc.api_server.uvicorn_threaded import UvicornServer
|
||||||
from freqtrade.rpc.api_server.ws.message_stream import MessageStream
|
from freqtrade.rpc.api_server.ws.message_stream import MessageStream
|
||||||
from freqtrade.rpc.api_server.ws_schemas import WSMessageSchemaType
|
|
||||||
from freqtrade.rpc.rpc import RPC, RPCException, RPCHandler
|
from freqtrade.rpc.rpc import RPC, RPCException, RPCHandler
|
||||||
|
|
||||||
|
|
||||||
@ -72,9 +68,6 @@ class ApiServer(RPCHandler):
|
|||||||
self._standalone: bool = standalone
|
self._standalone: bool = standalone
|
||||||
self._server = None
|
self._server = None
|
||||||
|
|
||||||
self._ws_queue = None
|
|
||||||
self._ws_publisher_task = None
|
|
||||||
|
|
||||||
ApiServer.__initialized = True
|
ApiServer.__initialized = True
|
||||||
|
|
||||||
api_config = self._config['api_server']
|
api_config = self._config['api_server']
|
||||||
@ -130,9 +123,8 @@ class ApiServer(RPCHandler):
|
|||||||
cls._rpc = None
|
cls._rpc = None
|
||||||
|
|
||||||
def send_msg(self, msg: Dict[str, Any]) -> None:
|
def send_msg(self, msg: Dict[str, Any]) -> None:
|
||||||
if self._ws_queue:
|
if ApiServer._message_stream:
|
||||||
sync_q = self._ws_queue.sync_q
|
ApiServer._message_stream.publish(msg)
|
||||||
sync_q.put(msg)
|
|
||||||
|
|
||||||
def handle_rpc_exception(self, request, exc):
|
def handle_rpc_exception(self, request, exc):
|
||||||
logger.exception(f"API Error calling: {exc}")
|
logger.exception(f"API Error calling: {exc}")
|
||||||
@ -184,45 +176,10 @@ class ApiServer(RPCHandler):
|
|||||||
if not ApiServer._message_stream:
|
if not ApiServer._message_stream:
|
||||||
ApiServer._message_stream = MessageStream()
|
ApiServer._message_stream = MessageStream()
|
||||||
|
|
||||||
if not self._ws_queue:
|
|
||||||
self._ws_queue = ThreadedQueue()
|
|
||||||
|
|
||||||
if not self._ws_publisher_task:
|
|
||||||
self._ws_publisher_task = asyncio.create_task(
|
|
||||||
self._publish_messages()
|
|
||||||
)
|
|
||||||
|
|
||||||
async def _api_shutdown_event(self):
|
async def _api_shutdown_event(self):
|
||||||
if ApiServer._message_stream:
|
if ApiServer._message_stream:
|
||||||
ApiServer._message_stream = None
|
ApiServer._message_stream = None
|
||||||
|
|
||||||
if self._ws_queue:
|
|
||||||
self._ws_queue = None
|
|
||||||
|
|
||||||
if self._ws_publisher_task:
|
|
||||||
self._ws_publisher_task.cancel()
|
|
||||||
|
|
||||||
async def _publish_messages(self):
|
|
||||||
"""
|
|
||||||
Background task that reads messages from the queue and adds them
|
|
||||||
to the message stream
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
async_queue = self._ws_queue.async_q
|
|
||||||
message_stream = ApiServer._message_stream
|
|
||||||
|
|
||||||
while message_stream:
|
|
||||||
message: WSMessageSchemaType = await async_queue.get()
|
|
||||||
message_stream.publish(message)
|
|
||||||
|
|
||||||
# Make sure to throttle how fast we
|
|
||||||
# publish messages as some clients will be
|
|
||||||
# slower than others
|
|
||||||
await asyncio.sleep(0.01)
|
|
||||||
async_queue.task_done()
|
|
||||||
finally:
|
|
||||||
self._ws_queue = None
|
|
||||||
|
|
||||||
# def start_message_queue(self):
|
# def start_message_queue(self):
|
||||||
# if self._ws_thread:
|
# if self._ws_thread:
|
||||||
# return
|
# return
|
||||||
|
@ -30,8 +30,8 @@ class WebSocketChannel:
|
|||||||
# Internal event to signify a closed websocket
|
# Internal event to signify a closed websocket
|
||||||
self._closed = asyncio.Event()
|
self._closed = asyncio.Event()
|
||||||
|
|
||||||
# Throttle how fast we send messages
|
# The subscribed message types
|
||||||
self._throttle = 0.01
|
self._subscriptions: List[str] = []
|
||||||
|
|
||||||
# Wrap the WebSocket in the Serializing class
|
# Wrap the WebSocket in the Serializing class
|
||||||
self._wrapped_ws = serializer_cls(self._websocket)
|
self._wrapped_ws = serializer_cls(self._websocket)
|
||||||
@ -51,7 +51,6 @@ class WebSocketChannel:
|
|||||||
"""
|
"""
|
||||||
Send a message on the wrapped websocket
|
Send a message on the wrapped websocket
|
||||||
"""
|
"""
|
||||||
await asyncio.sleep(self._throttle)
|
|
||||||
await self._wrapped_ws.send(message)
|
await self._wrapped_ws.send(message)
|
||||||
|
|
||||||
async def recv(self):
|
async def recv(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user