停止 Thrift 服务器(TSimpleServer)

2024-03-15

我有一个 Thrift 服务器的简单用例(TSimpleServer)其中我生成了几个线程(除了主线程之外)。新生成的线程之一进入 Thrift 事件循环(即server.serve())。在主线程中收到信号后,我调用server.stop()这导致了下面发布的错误。

起初我以为这是一个未捕获的异常。然而,包装这两个调用server.serve() and server.stop() in try-catch这无助于隔离问题。有什么想法/建议(关于我应该做什么)?大多数 Thrift 教程/指南/示例似乎都在谈论服务器启动,但似乎没有提及停止场景,这方面的任何指针/最佳实践/建议都会很棒。谢谢。

另外,我正在使用 thrift-0.7.0。

错误详情:

Thrift: Fri Nov 18 21:22:47 2011 TServerTransport died on accept: TTransportExc\
eption: Interrupted
*** glibc detected *** ./build/mc_daemon: munmap_chunk(): invalid poi\
nter: 0x0000000000695f18 ***
Segmentation fault (core dumped)

这也是堆栈跟踪:

#0  0x00007fb751c92f08 in ?? () from /lib/libc.so.6
#1  0x00007fb7524bb0eb in apache::thrift::server::TSimpleServer::serve (
    this=0x1e5bca0) at src/server/TSimpleServer.cpp:140
#2  0x000000000046ce15 in a::b::server_thread::operator() (
    this=0x695f18)
    at /path/to/server_thread.cpp:80
#3  0x000000000046c1a9 in boost::detail::thread_data<boost::reference_wrapper<a\
ds::data_load::server_thread> >::run (this=0x1e5bd80)
    at /usr/include/boost/thread/detail/thread.hpp:81
#4  0x00007fb7526f2b70 in thread_proxy ()
   from /usr/lib/libboost_thread.so.1.40.0
#5  0x00007fb7516fd9ca in start_thread () from /lib/libpthread.so.0
#6  0x00007fb7519fa70d in clone () from /lib/libc.so.6
#7  0x0000000000000000 in ?? ()

编辑1:我添加了伪代码主线程 http://pastebin.com/CqNgLxnf, the 节俭服务器线程 http://pastebin.com/ZKVTUDeq后台线程 http://pastebin.com/67r7vwEW.

编辑2:我似乎已经解决了最初的问题,如下面我的回答中所述。然而,这个解决方案导致了两个相当不受欢迎/有问题的设计选择:(i)我必须引入一个 thrift 端点来启用一种停止服务器的机制(ii)thrift 服务的处理程序类(通常需要实例化服务器)对象)现在需要一种方法来向服务器发出停止信号,从而引入了某种循环依赖。

对于这些设计问题/选择的任何建议将不胜感激。


我的问题似乎源于我的代码/设计,其中我在主线程中调用了信号处理程序代码stop在“服务器线程”中启动的服务器上。更改此行为(如 Pastebin 代码片段中所述)有助于解决此问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

停止 Thrift 服务器(TSimpleServer) 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当

随机推荐

  • 事件侦听器在没有事件的情况下执行并循环遍历 HTML 集合

    我正在尝试编写一个循环来初始化 JavaScript 中的事件处理程序 我认为我做错了什么 因为我的调试功能在没有事件 点击 发生的情况下被激活 我想做的是这样的 var JS elements document getElementsBy
  • Ada T'Class 的基础知识

    虽然有点不好意思问这个问题 但我知道这是最好的 我已经使用 Ada 编程很多年了 并且几乎可以流利地理解该语言的每个部分 然而 我似乎始终无法完全理解 T Class 借用别人的话 有人可以 像我五岁一样解释一下吗 编辑 我买它只是为了拥有
  • 如何在 while 循环中使用 .nextInt() 和 hasNextInt()

    所以我希望我的程序读取一个输入 其中一行中有一些整数 例如 1 1 2 然后它应该单独读取每个整数并将其打印在新行中 程序必须读取的整数数量没有提前给出 所以我想做的是使用 while 循环 该循环在没有更多整数可供读取后结束 这是我写的代
  • 如何迭代计算这个序列?

    我想迭代计算这个序列 A 0 j j 1 A i 0 A i 1 0 A i j A i 1 A i j 1 这是我的尝试 public function calculsuite1Action i j A array for k 0 k l
  • SwiftUI 中的内容拥抱优先行为

    我有一个List由单元格组成 每个单元格包含一个图像和一列文本 我希望以特定的方式布局 左图 占宽度的四分之一 其余空间留给文本 左对齐 这是我得到的代码 struct TestCell View let model ModelStruct
  • 我应该使用 request.POST 或 form.cleaned_data 中的文本

    这听起来像是一个微不足道的问题 但这对我来说是一场战斗 对于表单 然后点击提交 如果使用form cleaned data访问表单数据 或查找request POST 人们通常做的唯一一件事request POST就是查找提交按钮 但如果我
  • 如何在 SwiftUI 中禁用 ScrollView 弹跳

    Any Modifier可用于阻止反弹ScrollView in swiftUI struct RoomDetailsView View var body some View ScrollView showsIndicators false
  • 如何在GVim中从07增加到08?

    看起来像使用Ctrl A在 GVim 中不会从 07 增加到 08 因为前缀 0 被解释为八进制数 https stackoverflow com questions 13273741 why does incrementing with
  • android BottomNavigationView 中项目选定的颜色

    I refer this https medium com hitherejoe exploring the android design support library bottom navigation drawer 548de699e
  • 使用 Ionic 框架清除历史记录并在登录/注销时重新加载页面

    我是使用 Ionic 进行移动应用程序开发的新手 在登录和注销时 我需要重新加载页面 以便刷新数据 但是 state go mainPage 将用户带回视图而不重新加载 永远不会调用其背后的控制器 有没有办法清除历史记录并重新加载 Ioni
  • 尝试不同的函数,直到不抛出异常

    我有一些函数可以根据一组输入数据尝试各种方法来解决问题 如果该方法无法解决问题 则该函数将抛出异常 我需要按顺序尝试它们 直到没有抛出异常为止 我正在尝试找到一种方法来优雅地做到这一点 try answer method1 x y z ex
  • Google Data API - 两条腿的身份验证令牌重用

    我正在为 Google Contact Data API 使用两条腿的 OAuth 并在每个请求上生成令牌 是否可取或者我应该存储令牌以便下次重复使用吗 另外 如何检测陈旧的令牌 我正在使用Python 和 Gdata Python 客户端
  • JDBCPreparedStatement 始终返回 1 作为自动生成的键[重复]

    这个问题在这里已经有答案了 我有这段代码试图在数据库中插入一条记录 try Connection conn getConnection String sql INSERT INTO myTable userId content timest
  • BotFramework:“状态大小超出了配置的限制。”

    我正在开发一个机器人 每当我在表单流中 PostAsync 英雄卡 50 张英雄卡 时 最后它都会给我一条错误消息 状态大小超出了配置的限制 来自 Microsoft Bot Connector DLL 尝试 setPrivateConve
  • CSS 规则“.drop.a”应用于类“drag a”

    我有以下 HTML 标记 div class drag a div div class drop a div 我还有以下 CSS 规则 该规则仅适用于我的第二个 div drop a background color red 这工作正常 除
  • 截断存储过程中的表

    当我在 Oracle shell 中运行以下命令时 它工作正常 truncate table table name 但是当我尝试将其放入存储过程时 CREATE OR REPLACE PROCEDURE test IS BEGIN trun
  • Cypress 与 NextJS SSR - 使用 Axios 拦截 RESTful API

    我正在尝试在我的 SSR next js 应用程序上使用 cypress 和固定装置编写一些测试 该应用程序使用 Axios 连接到 RESTful API 但我在拦截 RESTful API 时遇到了麻烦cy intercept 因为 c
  • JavaScript 中的文件切片会导致空 blob

    我正在实现一个基于浏览器的分块文件上传器 打开我正在使用的文件
  • Git 重置所有具有特定扩展名的文件

    我对多种类型的文件进行了更改 例如 tsx scss and scss d ts 并已提交并推送到我的分支 有什么办法可以只重置扩展名 scss d ts与主人 保留更改 tsx and scss仅重置 scss d ts与主人 Thank
  • 停止 Thrift 服务器(TSimpleServer)

    我有一个 Thrift 服务器的简单用例 TSimpleServer 其中我生成了几个线程 除了主线程之外 新生成的线程之一进入 Thrift 事件循环 即server serve 在主线程中收到信号后 我调用server stop 这导致