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
Multithreading 我可以在同一个ZeroMQ REQ/REP套接字上从一个线程发送()和从另一个线程发送recv()吗?_Multithreading_Zeromq - Fatal编程技术网

Multithreading 我可以在同一个ZeroMQ REQ/REP套接字上从一个线程发送()和从另一个线程发送recv()吗?

Multithreading 我可以在同一个ZeroMQ REQ/REP套接字上从一个线程发送()和从另一个线程发送recv()吗?,multithreading,zeromq,Multithreading,Zeromq,正如文件所说,ZMQ套接字。因此,我假设标题的答案是“不” 尽管如此,我还是不知道如何使用ZMQ实现非阻塞模式: 具体地说,客户机有一个主线程,用于处理来自(线程安全的)消息队列的消息。消息来自各种来源,如网络、计时器、I/O等。 有时,主线程希望向远程服务器发送请求,但不希望等待响应(可能需要一段时间才能到达) 通常,我会使用两个线程: 主消息处理循环线程。这将在REQ/REP套接字上发出请求 将等待服务器响应的辅助侦听器线程。这将在套接字上使用阻塞recv(),并将响应推送到主线程的队列 我

正如文件所说,ZMQ套接字。因此,我假设标题的答案是“不”

尽管如此,我还是不知道如何使用ZMQ实现非阻塞模式:

具体地说,客户机有一个主线程,用于处理来自(线程安全的)消息队列的消息。消息来自各种来源,如网络、计时器、I/O等。 有时,主线程希望向远程服务器发送请求,但不希望等待响应(可能需要一段时间才能到达)

通常,我会使用两个线程:

  • 主消息处理循环线程。这将在REQ/REP套接字上发出请求
  • 将等待服务器响应的辅助侦听器线程。这将在套接字上使用阻塞
    recv()
    ,并将响应推送到主线程的队列

  • 我如何使用ZeroMQ实现这一点?辅助线程是否应该打开一个
    inproc
    套接字并侦听来自主线程的消息?

    实际上,单线程就足够了。只需向服务器发送请求并使用
    zmq\u poll()
    轮询消息即可

    如果一次只有一个请求是令人窒息的,那么这个模型就可以了。如果您需要异步发送多个请求和读取回复,请使用经销商套接字而不是REQ。只需发送一些requestId作为第一个帧,然后添加空分隔符帧,然后发送实际请求

    本指南第3章详细介绍了REQ/REP消息信封:


    如果这还不够清楚,请告诉我,我可能会用一些代码示例来扩展我的答案。

    谢谢@Wildfire。我可以保证一次一个请求,所以我不会违反请求-回复顺序。但是,我希望主线程发送请求,并让侦听器线程等待它。这是一种非常常见的模式,但它需要两个线程来访问套接字-main将send(),监听器将recv()@bavaza仍然需要在同一个线程上调用send()和recv()。如果您想在另一个线程上recv(),那么最简单的方法就是对它调用send()。