- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 python 实现 gRPC 客户端和服务器。服务器成功接收来自客户端的数据,但客户端收到返回“RST_STREAM with error code 2”。
它实际上意味着什么?我该如何解决它?
这是我的原型(prototype)文件:
service MyApi {
rpc SelectModelForDataset (Dataset) returns (SelectedModel) {
}
}
message Dataset {
// ...
}
message SelectedModel {
// ...
}
我的服务实现如下所示:
class MyApiServicer(my_api_pb2_grpc.MyApiServicer):
def SelectModelForDataset(self, request, context):
print("Processing started.")
selectedModel = ModelSelectionModule.run(request, context)
print("Processing Completed.")
return selectedModel
我使用以下代码启动服务器:
import grpc
from concurrent import futures
#...
server = grpc.server(futures.ThreadPoolExecutor(max_workers=100))
my_api_pb2_grpc.add_MyApiServicer_to_server(MyApiServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
我的客户看起来像这样:
channel = grpc.insecure_channel(target='localhost:50051')
stub = my_api_pb2_grpc.MyApiStub(channel)
dataset = my_api_pb2.Dataset()
# fill the object ...
model = stub.SelectModelForDataset(dataset) # call server
客户端发出调用后,服务器开始处理直到完成(大约需要一分钟),但客户端立即返回并出现以下错误:
Traceback (most recent call last):
File "Client.py", line 32, in <module>
run()
File "Client.py", line 26, in run
model = stub.SelectModelForDataset(dataset) # call server
File "/usr/local/lib/python3.5/dist-packages/grpc/_channel.py", line 484, in __call__
return _end_unary_response_blocking(state, call, False, deadline)
File "/usr/local/lib/python3.5/dist-packages/grpc/_channel.py", line 434, in _end_unary_response_blocking
raise _Rendezvous(state, None, None, deadline)
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.INTERNAL, Received RST_STREAM with error code 2)>
如果我异步执行请求并等待将来,
model_future = stub.SelectModelForDataset.future(dataset) # call server
model = model_future.result()
客户端等待直到完成,但之后仍然返回错误:
Traceback (most recent call last):
File "AsyncClient.py", line 35, in <module>
run()
File "AsyncClient.py", line 29, in run
model = model_future.result()
File "/usr/local/lib/python3.5/dist-packages/grpc/_channel.py", line 276, in result
raise self
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with (StatusCode.INTERNAL, Received RST_STREAM with error code 2)>
UPD:启用跟踪GRPC_TRACE=all
后,我发现了以下内容:
客户,请求后立即:
E0109 17:59:42.248727600 1981 channel_connectivity.cc:126] watch_completion_error: {"created":"@1515520782.248638500","description":"GOAWAY received","file":"src/core/ext/transport/chttp2/transport/chttp2_transport.cc","file_line":1137,"http2_error":0,"raw_bytes":"Server shutdown"}
E0109 17:59:42.451048100 1979 channel_connectivity.cc:126] watch_completion_error: "Cancelled"
E0109 17:59:42.451160000 1979 completion_queue.cc:659] Operation failed: tag=0x7f6e5cd1caf8, error={"created":"@1515520782.451034300","description":"Timed out waiting for connection state change","file":"src/core/ext/filters/client_channel/channel_connectivity.cc","file_line":133}
...(last two messages keep repeating 5 times every second)
服务器:
E0109 17:59:42.248201000 1985 completion_queue.cc:659] Operation failed: tag=0x7f3f74febee8, error={"created":"@1515520782.248170000","description":"Server Shutdown","file":"src/core/lib/surface/server.cc","file_line":1249}
E0109 17:59:42.248541100 1975 tcp_server_posix.cc:231] Failed accept4: Invalid argument
E0109 17:59:47.362868700 1994 completion_queue.cc:659] Operation failed: tag=0x7f3f74febee8, error={"created":"@1515520787.362853500","description":"Server Shutdown","file":"src/core/lib/surface/server.cc","file_line":1249}
E0109 17:59:52.430612500 2000 completion_queue.cc:659] Operation failed: tag=0x7f3f74febee8, error={"created":"@1515520792.430598800","description":"Server Shutdown","file":"src/core/lib/surface/server.cc","file_line":1249}
... (last message kept repeating every few seconds)
UPD2:
我的 Server.py
文件的完整内容:
import ModelSelectionModule
import my_api_pb2_grpc
import my_api_pb2
import grpc
from concurrent import futures
import time
class MyApiServicer(my_api_pb2_grpc.MyApiServicer):
def SelectModelForDataset(self, request, context):
print("Processing started.")
selectedModel = ModelSelectionModule.run(request, context)
print("Processing Completed.")
return selectedModel
# TODO(shalamov): what is the best way to run a python server?
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=100))
my_api_pb2_grpc.add_MyApiServicer_to_server(MyApiServicer(), server)
server.add_insecure_port('[::]:50051')
server.start()
print("gRPC server started\n")
try:
while True:
time.sleep(24 * 60 * 60) # run for 24h
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
UPD3:似乎是 ModelSelectionModule.run
导致了问题。我尝试将其隔离到一个单独的线程中,但没有帮助。 selectedModel
最终被计算出来,但此时客户端已经消失了。 如何防止此调用干扰 grpc?
pool = ThreadPool(processes=1)
async_result = pool.apply_async(ModelSelectionModule.run(request, context))
selectedModel = async_result.get()
该调用相当复杂,它会生成并加入许多线程,调用不同的库,例如 scikit-learn 和 smac 等。如果我把所有内容都贴在这里就太多了。
在调试时,我发现在客户端发出请求后,服务器保持 2 个连接打开(fd 3
和 fd 8
)。如果我手动关闭fd 8
或向其写入一些字节,我在客户端中看到的错误将变为Streamremoved
(而不是Received RST_STREAM with error code 2
)。似乎套接字(fd 8
)以某种方式被子进程损坏。 这怎么可能?如何保护套接字不被子进程访问?
最佳答案
这是在进程处理程序中使用 fork() 的结果。 gRPC Python 不支持此用例。
关于python - gRPC:Rendezvous 终止(StatusCode.INTERNAL,收到 RST_STREAM,错误代码为 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48174240/
public abstract class Enum> implements Comparable, Serializable class StatusCode extends Enum 在j
根据动态SDK: The previous operations can also be performed by using the Execute method with the appropri
如何在golang中间件中获取Response statusCode? ResponseWriter只有WriteHeader接口(interface),找不到get接口(interface)。 最佳
测试连接服务器 |选择对象 * 返回许多属性,其中包括 StatusCode。 我怎样才能只返回这个值?我最好的猜测是 $r = test-connection server $r.statuscod
有没有一种简单的方法可以在 Web 配置中捕获多个/所有 http 状态代码?目前我有 但是假设我想捕获 501、502、503 等等,我没有办法做一个范围或处理所有状态代码吗?如果可
据我了解,使用 ajax 处理错误结果的一种可能性如下: $.ajax({ url: someUrl, type: 'POST', success: function(data
我有这个异常(exception): HttpException {#689 ▼ -statusCode: 403 -headers: [] #message: ""
我正在使用 Hamcrest 对 REST API 进行单元测试。 当我发送请求时,我经常检查 200像这样的状态代码: public void myTest() { url = "route
谁能告诉我是否可以使用 jquery statusCode 将一个状态代码切换到下一个状态代码,以便一个响应可以处理 2 个状态代码?下面的代码有一个错误,但它显示了我想要实现的目标...400 下降
我已经阅读了几十篇关于如何正确处理来自 jQuery AJAX 调用的 HTTP 状态代码的文章,但我完全失败了。也许有一个错误?如果这个问题在其他地方得到了回答,请原谅我,但我根本无法让它发挥作用。
我正在尝试处理 302 重定向响应。我看到 HttpStatusCode 的 toString 方法有不同的行为。 HttpWebResponse response = (HttpWebRespons
我正在尝试在 ajax 调用的 StatusCode 中设置一个 bool 值,稍后我可以将其重新用于其他一些工作。这是我尝试过的: window.flag = false; // This
非常感谢任何正确方向的指针,我正在使用node/express,并且仍然是初学者,试图重用以前工作项目中的一些代码,但遇到了困难。 尝试访问用于验证电子邮件的 API,但响应没有提供我期望的状态代码。
我们正在将我们的解决方案之一移植到 PCL,但在 NET 框架基类库的受支持类和属性方面面临很多问题。为了使相同的功能在不同的平台上工作,我们实现了 WebClient,但我们在 WebResporn
下面是我用于 Google 登录的代码。我在应用程序文件夹中添加了 google-services.json 文件。我正在使用 classpath 'com.google.gms:google-ser
我正在使用锁定机制来确保两个并行调用不会更新导致意外行为的同一行。所以我的代码是这样的:(没有真实世界的例子) public class UserController { public Actio
我们正在编写一组类似 REST 的服务,我们将错误作为不同的 StatusCodes 返回。 在我们的客户端应用程序中,如果我们的工作流程不需要我们捕获并抛出异常来发现错误代码,我们更愿意这样做。 有
我有以下方法: public void SetHttpStatusCode(HttpStatusCode httpStatusCode) { Response.Stat
我有以下用于默认 jQuery AJAX 错误处理的代码: $.ajaxSetup({ error : function(jqXHR, textStatus, errorThrown) {
在 jquery Ajax 调用中,我当前正在处理 200 和 304 的 statusCode。但我还定义了“Error”来捕获可能返回的任何错误。 如果存在相关的验证消息,我们将返回状态代码 40
我是一名优秀的程序员,十分优秀!