NetMq 套接字是线程安全的吗?
NetMq sockets are thread safe?
我使用私有字段(PushSocket
- zmq_push 套接字用于 netmq)
private PushSocket _pushSocket;
以及在不同线程中使用此套接字的两个方法
public void Method1()
{
//.....//
_pushSocket.SendFrame(....);
//.....//
}
public void Method2()
{
//.....//
_pushSocket.SendFrame(....);
//.....//
}
我应该使用 lock
还是其他同步原语?
没有,
在了解ZeroMQ
专业级建议一:
不要设计线程间共享套接字的代码。
根据设计,
ZeroMQ
S可扩展F普通C通信 Patterns (a.k.a。有点误导性地昵称为 socket(s) )
不是线程安全的 (并且从未尝试过).
相信一个人有能力以某种方式调解线程间信号并不是一件事情,主要的信念是,良好的可扩展并行代码应该永远不会共享,也不会阻塞 .
如是说ZeroMQ
传福音。
困惑? np.
生气的? np.
Zero-sharing, Zero-locking -- 尝试将其视为某种形式的冲突避免,而不是从不受控制的并发破坏中烧焦的灰烬中筛出灰烬。
如有疑问
最好的选择是阅读 Pieter HINTJENS 的 书 "Code Connected. Volume 1" 并花一些时间了解 Pieters 关于可扩展代码设计原则的观点。
你很快就会爱上新的思维方式ZeroMQ
-way。
ZeroMQ 套接字不是线程安全的。我通过以下方式使用 BlockingCollection 解决了类似的问题:
class MyClass
{
private PushSocket _pushSocket;
private BlockingCollection<NetMQMessage> _toSend = new BlockingCollection<NetMQMessage>();
MyClass()
{
_pushSocket = new PushSocket();
_pushSocket.Bind("someaddress");
Task.Factory.StartNew(WorkerThread, TaskCreationOptions.LongRunning);
}
private void WorkerThread()
{
while (true)
{
NetMQMessage message = _toSend.Take();
_pushSocket.SendMultipartMessage(message);
}
}
public void Method1(NetMQMessage message)
{
_toSend.Add(message);
}
public void Method2(NetMQMessage message)
{
_toSend.Add(message);
}
}
您还应该实施适当的处置(破坏 WorkerThread 和处置 _toSend),仅此而已。
我使用私有字段(PushSocket
- zmq_push 套接字用于 netmq)
private PushSocket _pushSocket;
以及在不同线程中使用此套接字的两个方法
public void Method1()
{
//.....//
_pushSocket.SendFrame(....);
//.....//
}
public void Method2()
{
//.....//
_pushSocket.SendFrame(....);
//.....//
}
我应该使用 lock
还是其他同步原语?
没有,
在了解ZeroMQ
专业级建议一:
不要设计线程间共享套接字的代码。
根据设计,
ZeroMQ
S可扩展F普通C通信 Patterns (a.k.a。有点误导性地昵称为 socket(s) )
不是线程安全的 (并且从未尝试过).
相信一个人有能力以某种方式调解线程间信号并不是一件事情,主要的信念是,良好的可扩展并行代码应该永远不会共享,也不会阻塞 .
如是说ZeroMQ
传福音。
困惑? np.
生气的? np.
Zero-sharing, Zero-locking -- 尝试将其视为某种形式的冲突避免,而不是从不受控制的并发破坏中烧焦的灰烬中筛出灰烬。
如有疑问
最好的选择是阅读 Pieter HINTJENS 的 书 "Code Connected. Volume 1" 并花一些时间了解 Pieters 关于可扩展代码设计原则的观点。
你很快就会爱上新的思维方式ZeroMQ
-way。
ZeroMQ 套接字不是线程安全的。我通过以下方式使用 BlockingCollection 解决了类似的问题:
class MyClass
{
private PushSocket _pushSocket;
private BlockingCollection<NetMQMessage> _toSend = new BlockingCollection<NetMQMessage>();
MyClass()
{
_pushSocket = new PushSocket();
_pushSocket.Bind("someaddress");
Task.Factory.StartNew(WorkerThread, TaskCreationOptions.LongRunning);
}
private void WorkerThread()
{
while (true)
{
NetMQMessage message = _toSend.Take();
_pushSocket.SendMultipartMessage(message);
}
}
public void Method1(NetMQMessage message)
{
_toSend.Add(message);
}
public void Method2(NetMQMessage message)
{
_toSend.Add(message);
}
}
您还应该实施适当的处置(破坏 WorkerThread 和处置 _toSend),仅此而已。