0MQ (ZeroMQ) 是一个轻量级消息内核。它可用于C、C++、Python、.NET /Mono、Fortran 和 Java 语言。它运行在AIX ,FreeBSD的,基于HP - UX , Linux和MacOS下, OpenBSD系统, OpenVMS , QNX Neutrino,Solaris 和 Windows 操作系统。
ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It‘s fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems.
一、0MQ套接字的相关说明
ZeroMQ的连接与旧式的TCP连接有些不同
主要的明显不同是:
它们跨任意的传输协议(inproc、ipc、tcp、pgm或epgm)。参阅zmq_inproc()、zmq_ipc()、zmq_tcp()、zmq_pgm()、zmq_epgm()
一个套接字可能会有很多输入和输出连接
不存在zmq_listen()、zmq_accept()方法,当一个套接字被绑定到一个端点的时候,它自定地开始监听、接受连接
网络连接本身是在后台发生的,而如果网络连接断开(例如,对等节点消失后又回来),ZeroMQ会自动地重新连接
应用程序不能与这些连接直接交流,它们是被封装在套接字之下的
各个节点可以任意地启动和停止
在传统的网络中,如果我们在服务器未启动的情况下使用客户端去连接服务器,那么客户端将返回错误,但是ZeroMQ允许我们任意地启动和停止各部件
提前写入数据
假设服务端未启动,客户端先调用zmq_connect()连接指定的服务端,之后客户端就可以向套接字写入数据了,客户端会将消息写入队列,当后面服务端再调用zmq_bind()启动的时候就会收到客户端之前发送过来的数据
如果客户端在服务端启动之前,写入的消息过多导致消息被丢弃,那么服务端就不会收到丢失的数据
演示案例如下
我们以hwclient.c和hwserver.c为例:
①左侧先启动客户端,右侧还未启动服务端。可以看到客户端已经向消息队列中写入了第一条数据,但是由于客户端要等待服务端接收并给自己回送消息才能继续发送消息,因此客户端阻塞
一个服务端节点可以绑定多个端点
一个服务器节点可以绑定到多个端点(即协议和地址的组合),只需要单个套接字就能够做到。这意味着它能接受不同的传输协议:
void *socket = zmq_socket(xxx);
zmq_bind(socket, "tcp://*:5555");
zmq_bind(socket, "tcp://*:9999");
zmq_bind(socket, "inproc://somename");
除了ipc传输协议,其他传输协议不能将地址绑定到一个已经被启动的端点上
但是ipc传输协议允许一个进程绑定到已被其他进行使用的端点,这意味着允许一个进程在崩溃后恢复
通信协议
0MQ提供了一组单播传输(inproc、ipc和tcp)和多播传输(epgm、pgm)
多播是一种先进的技术,我们在后面文章讲解
tcp:
tcp是最常使用的情况,这是一个断开连接的TCP传输。它是可伸缩的、可移植的,并且在大多数情况下足够快
我们之所以称之为“断开连接”,是因为0MQ的TCP传输在你连接到端点前,不需要端点存在。客户端和服务器可以在任何时候连接和绑定,并且它对应用程序保持透明
ipc:
进程间的ipc传输也是断开连接的。有一个限制:它不能在Windows上工作
按照惯例,zmq_bind()时我们使用“.ipc”扩展名为端点命名,以避免与其他文件名产生冲突。在Unix系统中,如果你使用ipc端点,创建ipc文件需要适当权限,否则,它们可能无法在不同用户ID运行的进程之间共享。你还必须确保所有的进程都可以访问该文件,例如,通过在同一个工作目录下运行
inproc:
在线程间的传输中,inproc是一个连接的信令传送,它比tcp或ipc快得多
与tcp和ipc相比,这种传输有特定的限制,但服务器必须在任何客户端发出连接之前,发出一个绑定请求。0MQ的未来版本可能会解决这个问题,但目前这定义了你如何使用inproc套接字:我们创建和绑定一个套接字,并启动子线程,从而创建并连接其他套接字
二、套接字的创建(zmq_socket)
void *zmq_socket(void *context, int type);
功能:创建套接字
参数:
context:关联的上下文句柄
type:指定创建的套接字的类型。见下面详细介绍
返回值:
成功:返回套接字句柄,在ZeroMQ中,套接字是无类型的指针
失败:返回NULL,并将errno设置为如下值之一:
EINVAL:请求的套接字类型无效
EFAULT:所提供的上下文无效。
EMFILE:ZeroMQ指定的套接字最大数量已满
ETERM:指定的上下文已终止
与常规套接字的关键区别:
一般来说,传统的套接字提供了到面向连接的可靠字节流(SOCK_STREAM)或无连接的不可靠数据报(SOCK_DGRAM)的同步接口。相比之下,0MQ socket提供了异步消息队列的抽象,其确切的排队语义取决于使用的套接字类型
在常规套接字传输字节流或离散数据报流的地方,0MQ套接字传输离散消息
0MQ套接字是异步的,意味着物理连接的建立、关闭、重新连接和有效教父的时间堆用户是透明的,并由0MQ自己组织。此外,在对等端无法接收消息时,消息可能会排队
传统的套接字只允许严格的一对一(两个对等点)、多对一(许多客户端、一台服务器),或者在某些情况下只允许一对多(多播)关系。除了ZMQ_PAIR,0MQ套接字可被连接到多个端点使用zmq_connect(),同时接受传入的连接来自多个端点绑定套接字使用zmq_bind(),从而允许多对多的关系
线程安全:
0MQ具有线程安全的套接字类型,也有线程不安全的套接字类型。应用程序不得使用多线程的非线程安全套接字,除非在将套接字从一个线程迁移到另一个具有“完全隔离”内存屏障的线程之后
下面是线程安全套接字:
ZMQ_CLIENT
ZMQ_SERVER
ZMQ_DISH
ZMQ_RADIO
ZMQ_SCATTER
ZMQ_GATHER
客户端-服务器模式(Client-server)
客户机-服务器模式用于允许一个ZMQ_SERVER服务器与一个或多个ZMQ_CLIENT客户机通信。客户端总是启动对话,之后任何一方都可以向另一方异步发送消息
该模式仍在草案阶段
ZMQ_CLIENT
ZMQ_CLIENT套接字与ZMQ_SERVER套接字通信。任何一个对等点都可以连接,但是通常推荐的模型是绑定ZMQ_SERVER并连接ZMQ_CLIENT
如果ZMQ_CLIENT套接字已经建立了连接,zmq_send()将接受消息,将它们排成队列,并在网络允许的情况下尽可能快地发送它们。传出缓冲区限制由套接字的高水位标志定义。如果传出缓冲区已满,或者没有连接的对等点,zmq_send()将默认阻塞。ZMQ_CLIENT套接字不会删除消息
当ZMQ_CLIENT套接字连接到多个ZMQ_SERVER套接字时,发送出去的消息将在连接的对等端之间循环分发。同样,ZMQ_CLIENT套接字公平地从每个连接的对等端接收消息。这种用法仅适用于无状态协议
ZMQ_CLIENT套接字是线程安全的,可以从多个线程同时使用。注意,来自ZMQ_SERVER套接字的响应将发送到调用zmq_msg_recv()的第一个客户机线程。如果需要获得对原始线程的响应,每个线程使用一个ZMQ_CLIENT套接字
ZMQ_CLIENT套接字是线程安全的。它们在发送时不接受ZMQ_SNDMORE选项,而在接收时不接受ZMQ_RCVMORE。这就限制了他们只能使用单个部件的数据。其目的是扩展API以允许分散/收集多部分数据
ZMQ_SERVER
ZMQ_SERVER套接字与一组ZMQ_CLIENT套接字通信。ZMQ_SERVER套接字只能应答传入消息:ZMQ_CLIENT对等端必须始终发起对话
每个接收到的消息都有一个routing_id,它是一个32位无符号整数。应用程序可以使用zmq_msg_routing_id(3)来获取它。要向给定的ZMQ_CLIENT对等点发送消息,应用程序必须使用zmq_msg_set_routing_id(3)在消息上设置对等点的routing_id
如果没有指定routing_id,或者没有引用已连接的客户端对等点,则发送调用将在EHOSTUNREACH中失败。如果客户端对等端的传出缓冲区已满,发送调用将阻塞,除非在发送中使用ZMQ_DONT_WAIT,在这种情况下,它将通过EAGAIN失败。ZMQ_SERVER套接字在任何情况下都不应该丢失消息
ZMQ_SERVER套接字是线程安全的。它们在发送时不接受ZMQ_SNDMORE选项,而在接收时不接受ZMQ_RCVMORE。这就限制了他们只能使用单个部件的数据。其目的是扩展API以允许分散/收集多部分数据
广播盘模式(Radio-dish)
广播盘模式用于以扇出方式将数据从单个发布者一对多分发到多个订户。
Radio-dish正在使用组(相对于Pub-sub主题),Dish套接字可以加入一个组,Radio套接字发送的每个消息都属于一个组。
组是限制为16个字符长度(包括null)的以null终止的字符串。目的是将长度增加到40个字符(包括null)。组的编码应为UTF8。
使用完全匹配(vs PubSub的前缀匹配)来匹配组
广播碟仍处于草案阶段
ZMQ_RADIO
发布者使用ZMQ_RADIO类型的套接字来分发数据。每个消息都属于一个组,使用zmq_msg_set_group()指定一个组。邮件将分发给组中的所有成员。所述zmq_recv()函数不是此套接字类型实现。
当ZMQ_RADIO套接字由于已达到订户的最高水位而进入静音状态时,将发送给有问题的订户的任何消息都将被丢弃,直到静音状态结束为止。对于该套接字类型,zmq_send()函数将永远不会阻塞。
ZMQ_RADIO套接字是线程安全的。他们在发送时不接受ZMQ_SNDMORE选项。这将它们限制为单个零件数据
ZMQ_DISH
用户使用ZMQ_DISH类型的套接字来订阅由无线电分发的组。最初,ZMQ_DISH套接字未订阅任何组,请使用zmq_join()加入一个组。要获取该组,消息属于zmq_msg_group()。该zmq_send()函数没有此套接字类型实现。
ZMQ_DISH套接字是线程安全的。他们不接受ZMQ_RCVMORE。这将它们限制为单个零件数据。
发布-订阅模式(Publish-subscribe)
发布-订阅模式用于以扇出方式将数据从单个发布者一对多分发到多个订阅者。
ZMQ_PUB
发布者使用类型为ZMQ_PUB的套接字来分发数据。发送的消息以扇出方式分发给所有连接的对等方
不能在ZMQ_PUB类型的套接字上执行zmq_msg_recv()等接收数据的函数
当ZMQ_PUB套接字由于已达到订阅者的高水位标记而进入静音状态时,将发送给有问题的订阅者的任何消息都将被丢弃,直到静音状态结束为止。关于“高水位标记”请参阅:
对于该套接字类型,zmq_msg_send()函数将永远不会阻塞
ZMQ_SUB
订阅者使用ZMQ_SUB类型的套接字来订阅发布者分发的数据
ZMQ_SUB套接字创建完成之后,ZMQ_SUB套接字未订阅任何消息,请使用zmq_setsockopt()的ZMQ_SUBSCRIBE选项指定要订阅的消息
不能在ZMQ_PUB类型的套接字上执行zmq_msg_recv()等接收数据的函数
ZMQ_XPUB
用法与ZMQ_PUB大部分相同
但是有一点与ZMQ_PUB不同:ZMQ_XPUB(自己)的订阅方可以向自己发送一个订阅信息来进行订阅。订阅消息是字节1(用于订阅)或字节0(用于取消订阅),后跟订阅主体。也接收不带子/取消订阅前缀的消息,但对订阅状态没有影响
ZMQ_XSUB
用法与ZMQ_SUB大部分相同
但是有一点与ZMQ_SUB不同:自己可以向发布者发送一条订阅信息来进行订阅。订阅消息是字节1(用于订阅)或字节0(用于取消订阅),后跟订阅主体。也接收不带子/取消订阅前缀的消息,但对订阅状态没有影响
流水线模式(Pipeline)
流水线模式用于将数据分发到布置在流水线中的节点。数据始终沿流水线向下流动,流水线的每一级都连接到至少一个节点。当流水线级连接到多个节点时,数据在所有连接的节点之间进行轮询。
ZMQ_PUSH
流水线节点使用类型为ZMQ_PUSH的套接字将消息发送到下游流水线节点。消息循环到所有连接的下游节点。该zmq_recv()函数没有此套接字类型实现。
当ZMQ_PUSH套接字由于已达到所有下游节点的高水位线而进入静音状态时,或者如果根本没有下游节点,则套接字上的任何zmq_send()操作都应阻塞,直到静音状态结束或处于至少一个下游节点可用于发送;消息不会被丢弃。
ZMQ_PULL
管道节点使用ZMQ_PULL类型的套接字从上游管道节点接收消息。消息从所有连接的上游节点中公平排队。该zmq_send()函数没有此套接字类型实现
独家对模式(Exclusive pair)
互斥对模式用于将一个对等点精确地连接到另一个对等点。此模式用于跨inproc传输的线程间通信
ZMQ_PAIR
ZMQ_PAIR类型的套接字只能一次连接到单个对等方。对通过ZMQ_PAIR套接字发送的消息不执行消息路由或筛选
当ZMQ_PAIR套接字由于已达到连接对等方的高水位线而进入静音状态时,或者如果没有连接任何对等方,则套接字上的任何zmq_send()操作都应阻塞,直到对等方可用于发送;消息不会被丢弃
尽管ZMQ_PAIR套接字可用于zmq_inproc()以外的其他传输方式,但是它们无法自动重新连接,同时新的传入连接将被终止,而任何先前的连接(包括处于关闭状态的连接)都会使它们不适合TCP在大多数情况下
ZMQ_PAIR套接字设计用于通过zmq_inproc()传输进行线程间通信,并且不实现自动重新连接等功能
本机模式(Native)
本机模式用于与TCP对等方通信,并允许在任一方向上进行异步请求和答复。
ZMQ_STREAM
一个套接字类型的ZMQ_STREAM用于发送和接收TCP数据从non-0MQ对等,当使用TCP:/ /运输。ZMQ_STREAM套接字可以充当客户端和/或服务器,异步发送和/或接收TCP数据。
当接收TCP数据时,在将消息传递给应用程序之前,ZMQ_STREAM套接字应在消息部分之前包含消息的始发对等方的路由ID。接收到的消息从所有连接的同级之间公平排队。
发送TCP数据时,ZMQ_STREAM套接字应删除消息的第一部分,并使用它来确定消息应路由到的对等方的路由ID,并且不可路由的消息将导致EHOSTUNREACH或EAGAIN错误。
要打开与服务器的连接,请使用zmq_connect调用,然后使用带有ZMQ_ROUTING_ID选项的zmq_getsockopt调用获取套接字路由ID。
要关闭特定连接,请发送路由ID帧,后跟零长度消息(请参见示例部分)。
建立连接后,应用程序将收到零长度的消息。同样,当对等方断开连接(或连接断开)时,应用程序将接收零长度的消息。
建立连接后,应用程序将收到零长度的消息。同样,当对等方断开连接(或连接断开)时,应用程序将接收零长度的消息。
您必须先发送一个路由ID帧,然后发送一个数据帧。ZMQ_SNDMORE标志是路由ID帧所必需的,但在数据帧上将被忽略。
请求-回复模式(Request-reply)
请求-答复模式用于将请求从ZMQ_REQ 客户端发送到一个或多个ZMQ_REP服务,并接收对每个发送的请求的后续答复。
ZMQ_REQ
客户端使用ZMQ_REQ类型的套接字向服务发送请求并从服务接收答复
此套接字类型仅允许zmq_send(request)和后续zmq_recv(reply)调用交替序列。发送的每个请求都在所有服务中轮流轮询,并且收到的每个答复都与最后发出的请求匹配
如果没有可用的服务,则套接字上的任何发送操作都应阻塞,直到至少有一项服务可用为止。REQ套接字不会丢弃消息
ZMQ_REP
服务使用ZMQ_REP类型的套接字来接收来自客户端的请求并向客户端发送回复
此套接字类型仅允许zmq_recv(request)和后续zmq_send(reply)调用的交替序列。接收到的每个请求都从所有客户端中公平排队,并且发送的每个回复都路由到发出最后一个请求的客户端
如果原始请求者不再存在,则答复将被静默丢弃
ZMQ_DEALER
ZMQ_DEALER类型的套接字是用于扩展请求/应答套接字的高级模式。发送的每条消息都是在所有连接的对等方之间进行轮询,并且收到的每条消息都是从所有连接的对等方进行公平排队的。
当ZMQ_DEALER套接字由于已达到所有对等点的最高水位而进入静音状态时,或者如果根本没有任何对等点,则套接字上的任何zmq_send()操作都应阻塞,直到静音状态结束或至少一个对等方变得可以发送;消息不会被丢弃。
将ZMQ_DEALER套接字连接到ZMQ_REP套接字时,发送的每个消息都必须包含一个空的消息部分,定界符以及一个或多个主体部分
ZMQ_ROUTER
ZMQ_ROUTER类型的套接字是用于扩展请求/答复套接字的高级套接字类型。当收到消息时,ZMQ_ROUTER套接字在将消息传递给应用程序之前,应在消息部分之前包含消息的始发对等方的路由ID。接收到的消息从所有连接的同级之间公平排队。发送消息时,ZMQ_ROUTER套接字应删除消息的第一部分,并使用它来确定消息应路由到的对等方的_routing id _。如果该对等点不再存在或从未存在,则该消息将被静默丢弃。但是,如果ZMQ_ROUTER_MANDATORY套接字选项设置为1,这两种情况下套接字都将失败并显示EHOSTUNREACH。
当ZMQ_ROUTER套接字由于达到所有同位体的高水位线而进入静音状态时,发送到该套接字的任何消息都将被丢弃,直到静音状态结束为止。同样,任何路由到已达到单个高水位标记的对等方的消息也将被丢弃。如果ZMQ_ROUTER_MANDATORY设置为1,则在两种情况下套接字都应阻塞或返回EAGAIN。
当ZMQ_ROUTER套接字的ZMQ_ROUTER_MANDATORY标志设置为1时,套接字应在接收到来自一个或多个对等方的消息后生成ZMQ_POLLIN事件。同样,当至少一个消息可以发送给一个或多个对等方时,套接字将生成ZMQ_POLLOUT事件。
当ZMQ_REQ套接字连接到ZMQ_ROUTER套接字时,除了始发对等方的路由ID外,每个收到的消息都应包含一个空的定界符消息部分。因此,由应用程序看到的每个接收到的消息的整个结构变为:一个或多个路由ID部分,定界符部分,一个或多个主体部分。将回复发送到ZMQ_REQ套接字时,应用程序必须包括定界符部分
演示案例:使用zmq_stream创建一个简单的http服务器
void *ctx = zmq_ctx_new ();
assert (ctx);
/* Create ZMQ_STREAM socket */
void *socket = zmq_socket (ctx, ZMQ_STREAM);
assert (socket);
int rc = zmq_bind (socket, "tcp://*:8080");
assert (rc == 0);
/* Data structure to hold the ZMQ_STREAM routing id */
uint8_t routing_id [256];
size_t routing_id_size = 256;
/* Data structure to hold the ZMQ_STREAM received data */
uint8_t raw [256];
size_t raw_size = 256;
while (1) {
/* Get HTTP request; routing id frame and then request */
routing_id_size = zmq_recv (socket, routing_id, 256, 0);
assert (routing_id_size > 0);
do {
raw_size = zmq_recv (socket, raw, 256, 0);
assert (raw_size >= 0);
} while (raw_size == 256);
/* Prepares the response */
char http_response [] =
"HTTP/1.0 200 OK
"
"Content-Type: text/plain
"
"
"
"Hello, World!";
/* Sends the routing id frame followed by the response */
zmq_send (socket, routing_id, routing_id_size, ZMQ_SNDMORE);
zmq_send (socket, http_response, strlen (http_response), 0);
/* Closes the connection by sending the routing id frame followed by a zero response */
zmq_send (socket, routing_id, routing_id_size, ZMQ_SNDMORE);
zmq_send (socket, 0, 0, 0);
}
zmq_close (socket); zmq_ctx_destroy (ctx);
movie.douban.com/doulist/128923680/
www.douban.com/doulist/128923680/
www.douban.com/doulist/128923680/comments
www.douban.com/doulist/128923680
book.douban.com/doulist/128923680
www.douban.com/doulist/128923680/?type=followers
www.douban.com/doulist/128923680/comments/
m.douban.com/doulist/128923680
movie.douban.com/doulist/128923686/
www.douban.com/doulist/128923686/
www.douban.com/doulist/128923686/comments
www.douban.com/doulist/128923686
book.douban.com/doulist/128923686
www.douban.com/doulist/128923686/?type=followers
www.douban.com/doulist/128923686/comments/
m.douban.com/doulist/128923686
李中杰发现的问题 www.xaoyo.com/gpBGyqpn
在欧盟国家普遍存在 www.xaoyo.com/pzBGyqpn
在欧盟疾控中心发布的官方资料中 www.xaoyo.com/peiBGyqpn
并没有明确指出密切接触者的判定时间问题 www.fx361.com/sogBGukbp
这导致防控工作出现了明显漏洞 m.fx361.com/zzzBGukbp
数据表明 www.fx361.com/baiBGukbp
近期欧洲成为了中国以外疫情最严重的地区 www.fx361.com/yuBGukbp
截至3月11日 www.xaoyo.com/gpBGukbp
整个欧洲的累计确诊病例数已突破2万 www.xaoyo.com/pzBGukbp
欧洲境内几乎所有国家和地区均已报告发现新冠肺炎确诊病例 www.xaoyo.com/peiBGukbp
另一位主讲专家东南大学附属中大医院党委副书记邱海波 www.fx361.com/sogBGldtn
也在跟国外同行的沟通中 m.fx361.com/zzzBGldtn
寻找着双方认知差异 www.fx361.com/baiBGldtn
意大利是他之前沟通较多的一个国家 www.fx361.com/yuBGldtn
因为公众场合戴口罩的措施 www.xaoyo.com/gpBGldtn
迟迟无法在该国推进 www.xaoyo.com/pzBGldtn
几天前 www.xaoyo.com/peiBGldtn
意大利议员达罗索戴口罩进入议会 www.fx361.com/sogBGqrfe
还遭到了群嘲 m.fx361.com/zzzBGqrfe
这样的沟通涉及方方面面 www.fx361.com/baiBGqrfe
如老年人发病的隐秘性 www.fx361.com/yuBGqrfe
ECMO的使用时机 www.xaoyo.com/gpBGqrfe
机械通气的恢复问题 www.xaoyo.com/pzBGqrfe
邱海波告诉谭主 www.xaoyo.com/peiBGqrfe
“实际上我们看到这些也挺着急的 www.fx361.com/sogBGrkqn
他们又在走我们的老路 m.fx361.com/zzzBGrkqn
” www.fx361.com/baiBGrkqn
虽然中国团队早就将这类经验进行了总结 www.fx361.com/yuBGrkqn
并在国际和国内刊物上发表 www.xaoyo.com/gpBGrkqn
但遗憾的是 www.xaoyo.com/pzBGrkqn
之前并没有引起足够的重视 www.xaoyo.com/peiBGrkqn
正因如此 www.fx361.com/sogBGbujp
这场通报会 m.fx361.com/zzzBGbujp
对弥合双方信息鸿沟 www.fx361.com/baiBGbujp
意义重大 www.fx361.com/yuBGbujp
12号当天 www.xaoyo.com/gpBGbujp
通报会结束之后 www.xaoyo.com/pzBGbujp
工作人员开始收拾会场 www.xaoyo.com/peiBGbujp
武汉分会场 www.fx361.com/sogBGfmcr
两位主讲专家邱海波和李群就坐在原地 m.fx361.com/zzzBGfmcr
继续参加世卫组织西太区的分享会 www.fx361.com/baiBGfmcr
跟各国探讨临床管理 www.fx361.com/yuBGfmcr
公共卫生干预等问题 www.xaoyo.com/gpBGfmcr
早一秒分享 www.xaoyo.com/pzBGfmcr
就多一分机会 www.xaoyo.com/peiBGfmcr
救人 www.fx361.com/sogBGbtbp
容不得半点耽搁 m.fx361.com/zzzBGbtbp
信息互通人心相近 www.fx361.com/baiBGbtbp
与世界连线 www.fx361.com/yuBGbtbp
已经成为近期不少中国医生的日常 www.xaoyo.com/gpBGbtbp
同样出席本次会议的王贵强 www.xaoyo.com/pzBGbtbp
来自北大第一医院感染科 www.xaoyo.com/peiBGbtbp
他的“日程”里 www.fx361.com/sogBGlwti
“云分享”可谓密集 m.fx361.com/zzzBGlwti
最近一个月 www.fx361.com/baiBGlwti
他已经先后受邀与东盟十国 www.fx361.com/yuBGlwti
中亚六国 www.xaoyo.com/gpBGlwti
太平洋岛国连线 www.xaoyo.com/pzBGlwti
这两天还有一个与中东欧国家的视频会议 www.xaoyo.com/peiBGlwti
频繁因连线登上热搜的还有钟南山 www.fx361.com/sogBGfgvt
在与欧洲呼吸学会候任主席视频连线后 m.fx361.com/zzzBGfgvt
12号晚上 www.fx361.com/baiBGfgvt
他又与美国哈佛大学医学院及美国重症监护方面的专家进行多方视频连线 www.fx361.com/yuBGfgvt
连线 www.xaoyo.com/gpBGfgvt
让信息互通 www.xaoyo.com/pzBGfgvt
让经验共享 www.xaoyo.com/peiBGfgvt
这一场前所未有的大流行病面前 www.fx361.com/sogBGqixn
经验无关东西 m.fx361.com/zzzBGqixn
只关乎生命 www.fx361.com/baiBGqixn
眼下 www.fx361.com/yuBGqixn
越来越多国家在采用政府指挥全社会系统化的措施 www.xaoyo.com/gpBGqixn
强力干预 www.xaoyo.com/pzBGqixn
扭转疫情 www.xaoyo.com/peiBGqixn
“科威特宣布封城” www.fx361.com/sogBGkdrz
“伊朗建立方舱医院” m.fx361.com/zzzBGkdrz
“荷兰呼吁取消所有100人以上的活动” www.fx361.com/baiBGkdrz
“梵蒂冈关闭圣彼得大教堂与广场” www.fx361.com/yuBGkdrz
“美国纽约州在疫情严重地建立控制区” www.xaoyo.com/gpBGkdrz
“意大利将建米兰版火神山” www.xaoyo.com/pzBGkdrz
中国经验 www.xaoyo.com/peiBGkdrz
正在抵达全球 www.fx361.com/sogBGnfdk
3月12日晚 m.fx361.com/zzzBGnfdk
国家主席应约同联合国秘书长古特雷斯通电话 www.fx361.com/baiBGnfdk
他在电话里再次表态 www.fx361.com/yuBGnfdk
愿同有关国家分享防控经验 www.xaoyo.com/gpBGnfdk
“这段时间 www.xaoyo.com/pzBGnfdk
疫情在多国多点发生 www.xaoyo.com/peiBGnfdk
形势令人担忧 www.fx361.com/sogBGefdr
国际社会应当加紧行动起来 m.fx361.com/zzzBGefdr
有效开展联防联控国际合作 www.fx361.com/baiBGefdr
凝聚起战胜疫情的强大合力 www.fx361.com/yuBGefdr
” www.xaoyo.com/gpBGefdr
从通话内容中我们可以读出 www.xaoyo.com/pzBGefdr
当前全球疫情防控的重点 www.xaoyo.com/peiBGefdr
在于加紧行动 www.fx361.com/sogBGvfnt
联防联控 m.fx361.com/zzzBGvfnt
凝聚合力 www.fx361.com/baiBGvfnt
这份沉甸甸的中国方案 www.fx361.com/yuBGvfnt
是中国对人类命运共同体理念的又一次实践 www.xaoyo.com/gpBGvfnt
也体现了一个负责任大国的气度与担当 www.xaoyo.com/pzBGvfnt
实际上 www.xaoyo.com/peiBGvfnt
从这场疫情一开始 www.fx361.com/sogBGlkki
中国就一直在强调合作 m.fx361.com/zzzBGlkki
也在积极主动与世界协调沟通 www.fx361.com/baiBGlkki
目前 www.fx361.com/yuBGlkki
主席已同法国 www.xaoyo.com/gpBGlkki
德国 www.xaoyo.com/pzBGlkki
沙特阿拉伯 www.xaoyo.com/peiBGlkki
美国 www.fx361.com/sogBGvndk
印度尼西亚 m.fx361.com/zzzBGvndk
卡塔尔 www.fx361.com/baiBGvndk
马来西亚 www.fx361.com/yuBGvndk
英国 www.xaoyo.com/gpBGvndk
韩国 www.xaoyo.com/pzBGvndk
巴基斯坦 www.xaoyo.com/peiBGvndk
阿联酋 www.fx361.com/sogBGiaon
埃塞俄比亚 m.fx361.com/zzzBGiaon
智利 www.fx361.com/baiBGiaon
古巴等十余个国家领导人通话 www.fx361.com/yuBGiaon
强调中国采取了最全面 www.xaoyo.com/gpBGiaon