我将尝试用一个例子来解释我在做什么,假设我正在构建一个天气客户端。浏览器通过 websocket 发送消息,例如:
{
"city": "Chicago",
"country": "US"
}
Run Code Online (Sandbox Code Playgroud)
服务器每 5 分钟查询一次天气,并使用最新数据更新浏览器。
现在浏览器可以发送另一条消息,例如:
{
"city": "Bangalore",
"country": "IN"
}
Run Code Online (Sandbox Code Playgroud)
现在我的服务器应该停止更新芝加哥的天气详细信息并开始更新有关班加罗尔的详细信息,即通过 websocket 同时发送/接收消息。我应该如何实施这个?
目前我有这个,但这只会在接收事件时更新浏览器:
@app.websocket("/ws")
async def read_webscoket(websocket: WebSocket):
await websocket.accept()
weather_client = WeatherClient(client)
while True:
data = await websocket.receive_json()
weather = await weather_client.weather(data)
await websocket.send_json(weather.dict())
Run Code Online (Sandbox Code Playgroud)
如果我移出websocket.receive_json()循环,我将无法连续收听来自浏览器的消息。我想我需要启动两个异步任务,但我不太能够确定实现,因为我是异步编程方式的新手。
我有一个 for 循环,我正在尝试使用 CompletableFuture 对其进行并行化。
for (int i = 0; i < 10000; i++) {
doSomething();
doSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的是:
for (int i = 0; i < 10000; i++) {
CompletableFuture.runAsync(() -> doSomething());
CompletableFuture.runAsync(() -> doSomethingElse());
}
Run Code Online (Sandbox Code Playgroud)
我想这可以达到目的,但是需要在所有处理开始和结束之前打印日志。如果我这样做:
log("Started doing things");
for (int i = 0; i < 10000; i++) {
CompletableFuture.runAsync(() -> doSomething());
CompletableFuture.runAsync(() -> doSomethingElse());
}
log("Ended doing things");
Run Code Online (Sandbox Code Playgroud)
这是否保证在所有 for 循环结束后将打印第二条日志语句,因为它是在单独的线程中执行的?如果没有,有没有办法在不阻塞主线程的情况下做到这一点?
java multithreading future executorservice completable-future