Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ZMQ多线程C客户端_C_Multithreading_Zeromq - Fatal编程技术网

ZMQ多线程C客户端

ZMQ多线程C客户端,c,multithreading,zeromq,C,Multithreading,Zeromq,我想要多线程zmq客户端的C示例,我已经在使用多线程服务器,但我要求每个客户端从多线程而不是从单个线程发送请求 我看了一下: 但我没有看到使用多线程的ZMQ\u交易商socket与多线程服务器(一个ZMQ\u路由器socket)对话的客户端示例 因此,我正在寻找经销商和路由器模式。我希望客户机(经销商是多线程的: 若我遵循多线程服务器示例的相同类比,我需要一个绑定多个线程的代理,对吗 或 使用pthread\u create是否足够 目前我的客户机与hello world C类似:

我想要多线程
zmq
客户端的C示例,我已经在使用多线程服务器,但我要求每个客户端从多线程而不是从单个线程发送请求

我看了一下:


但我没有看到使用多线程的
ZMQ\u交易商
socket与多线程服务器(一个
ZMQ\u路由器
socket)对话的客户端示例

因此,我正在寻找
经销商
路由器
模式。我希望客户机(经销商
是多线程的:

  • 若我遵循多线程服务器示例的相同类比,我需要一个绑定多个线程的代理,对吗

  • 使用pthread\u create
是否足够 目前我的客户机与hello world C类似:

zctx_t ctx = zctx_new ();
void *client = zsocket_new (ctx, ZMQ_REQ);
assert (client);
zsocket_connect (client, config.SERVER_ENDPOINT);

// SKIPPED: I get the data (hm->body.p) to be send through zmq...

// We send a request, then we work to get a reply

zstr_sendf(client, "%.*s", (int) hm->body.len,hm->body.p);

char *reply = zstr_recv (client);
if (  reply ) {
      zsys_info ("server replied (%s)", reply);
      free (reply);
} 
请帮助我使我的C客户机成为多线程
zmq
客户机

更新1(更多详细信息):

  • 我有一个需要集成的第三方应用程序(我们称之为3pa)。
    3pa
    平均每秒向HTTP侦听器发送4个请求(每个请求大小约60 KB)(我使用的是mongoose)
  • 3pa
    仅在收到
    “HTTP/1.1 200 OK\r\n”
    “reply”或发送请求超时后发送下一个
    HTTP POST
    。因此
    3pa
    似乎是单线程的
  • 如果我无法快速响应
    200 OK
    ,则
    3pa
    将在内存中保持排队,直到崩溃
  • 当我收到来自
    3pa
    的请求时,我需要使用ZMQ通过3G移动分组网络将其发送到后端服务器。由于3G移动分组网络的延迟和带宽,每个请求需要大约1-3秒才能发送,ZMQ replay
    新ZFrame(“OK”)
    启动、传输和交付(在
    3pa
    端接收)大约需要1-3秒

  • 因此,如果我们进行基本计算,
    3pa
    队列容量将由于3G移动分组网络的性能而迅速填满。

    从OP/Update 1中提供的几个细节来看,
    在谈论增加线程数量的想法之前,让我们先关注问题的根本原因


    真正重要的是什么? 鉴于
    3pa
    作为黑盒引入,具有经验丰富的阻塞设计(表示永远等待,直到
    200 OK
    交付,并在超时事件中转义)
    最好的第一步是按原样操作
    3pa
    ,而是在更好的NIX对等/托管中心托管/托管,而不是在当前昂贵的3G移动分组无线接入网络的“外围”最后一英里部分,这既可以避免/防止在任何优先呼叫流量抢占3G信道并阻塞RAN的情况下,容量驱动的DoS引入的数据包重新传输,也可以绝对减少往返延迟的成本,目前在上述2~6秒以上的水平上支付

    如果
    3pa
    重新定位到自己的NIX邻近位置不足以保存游戏,那么下一步可能是创建一个单一用途的http代理,该代理将接收60KB以上的http请求(该请求将被转发到适当的目标)这将立即向下游注入
    200OK
    响应到
    3pa
    手中,从而将其从内部阻塞循环中解锁,并允许其发送另一个排队的
    HTTP POST

    肮脏?是和否。它解决了较差的
    3pa
    设计的弱点,并允许在特定情况下操作


    最后一个注意事项-在实际场景中避免使用
    REQ/REP
    模式。 尽管ZeroMQ可伸缩的正式通信模式构建块是多方通信方案的智能示例,但不要期望它们对LoS、丢失消息和其他现实问题免疫
    REQ/REP
    模式能够在解除轨道的内部FSA状态下使自身死锁,在这种状态下,没有(字面上是零)工具可以将成对的FSA状态机从无法解除的相互死锁状态保存/恢复

    在这种设计中使用其他一些可伸缩的正式通信模式,并准备好在出现问题时提供额外的信令手段,以满足挽救状态的潜在需要。ZeroMQ有很多工具可以更智能地实现这一点,而不仅仅是依靠一个简单的原型,闭上眼睛,相信一切都将永远无差错地工作(这不是我们生活的现实,对吧:o))

    现实世界中的客户端操作许多zmq套接字实例,一些用于发送信号,一些用于传输服务,一些用于远程访问客户端的内部CLI接口,另一些用于分布式日志收集器,一些用于自诊断和托管系统健康检查。简单的、主要是非阻塞设计的客户端可能包含数千个SLOC,因此不要指望任何此类解决方案只包含来自图书馆wiki页面或一些精彩博客文章的几个SLOC的副本

    你可能还想,还可以链接到神奇的Pieter HINTJENS的,自从我开始喜欢ZeroMQ的思维方式和设计优先顺序以来,这一直是我的必读推荐书。信不信由你,值得花时间和精力,分布式处理还有其他更重要的规则,而不仅仅是为了糟糕和不可行的设计而要求更多的线程。

    能够将糟糕的设计变为糟糕的设计