我们有几个node.js进程应该能够传递消息,这样做最有效的方法是什么?如何使用node_redis pub/sub
编辑:进程可能在不同的机器上运行
我需要使用内置C++类型的参数从客户端进程向服务器进程发送(可能是一个)简单的单向命令(因此序列化非常简单).C++,Windows XP +.
我正在寻找一个不需要复杂配置的库,提供简单的界面,不需要数小时的学习时间,也没有商业使用限制.解决简单问题的简单方法.
Boost.Interprocess对于这个简单的任务来说太低级了,因为它不提供RPC接口.套接字也可能是一种过度杀伤,因为我不需要在机器之间进行通信.关于DCOM,CORBA等人也是如此.命名管道?从未使用过它们,WinAPI上的任何好库?的openmpi?
我想要以下内容
这是我的代码,显然没有实现我的目标.
var my_shared_var;
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Load a large table from file and save it into my_shared_var,
// hoping the worker processes can access to this shared variable,
// so that the worker processes do not need to reload the table from file.
// The loading typically takes 15 seconds.
my_shared_var = load('path_to_my_large_table');
// Fork worker processes
for (var i = 0; i < numCPUs; i++) {
cluster.fork(); …Run Code Online (Sandbox Code Playgroud) 我有两个C#应用程序,我希望其中一个发送两个整数到另一个(这不一定很快,因为它每隔几秒只调用一次).
最简单的方法是什么?(它不一定是最优雅的.)
我知道这似乎是一个微不足道的问题,但我无法在互联网上的任何地方找到任何具体的答案.我在stackoverflow上看到了这个非常相似的问题:如何从android活动启动Unity应用程序? 但它与我的问题完全相反.此外,android活动必须能够从Unity应用程序接收一些输入字符串,就像使用system()调用行参数以在PC上启动另一个程序一样.
以下是我在Android上测试Unity应用程序的测试按钮事件处理程序的代码:
private void ExternalAppCallHandler()
{
if(Application.platform == RuntimePlatform.WindowsEditor)
{
Process.Start(@"C:\Program Files (x86)\Notepad++\notepad++.exe");
}
else if(Application.platform == RuntimePlatform.Android)
{
Process.Start("Internet");
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用Unity Editor进行测试时,当我单击测试按钮时,应用程序会成功打开Notepad ++.exe.但是,当我尝试在我的三星Galaxy S2设备上打开"Internet"应用程序时,它失败了.有谁知道为什么会这样?使用Process.Start打开另一个Android应用程序的正确字符串应该是什么?
我有2个申请.
VB应用程序是用.NET 3.5编写的.这是一个很大的应用程序.我无法将其重写为C++,原因很简单.我不确定这是否重要,但它是x86应用程序.
C++应用程序是用.NET 4.0编写的.它是x64版本,不会有x86支持.现在 - 它是带有一些汇编代码的托管代码.当我更多地了解C++时,我将在以后混合托管和非托管.它是x64版本,必须保持这样.
它应该扩展VB应用程序功能 - 从相机捕获帧,用它们做一些事情并将处理过的图像发送到VB应用程序.图像非常大(1920x1080x24bpp),我需要每秒处理30-60帧,所以它必须是有效的方式.
我的目标:
从C++应用程序"发送"位图到VB应用程序,VB应用程序应该在该位图出现时启动一些方法.
从VB应用程序到C++应用程序以另一种方式"发送"一些信息.它应该从VB应用程序GUI更改C++应用程序处理参数.
如果可能 - 只发送一个指针和位图大小,而不是复制RAM中的整个数据.
可以说,我想要这样的东西:
VB方面:
Function receivedBitmapFromCpp(BMP_POINTER?, BMP_SIZE_X?, BMP_SIZE_Y?, BMP_BPP?) As Integer Handles ????
End Function
Run Code Online (Sandbox Code Playgroud)
C++方面:
void sendBitmapToVb(BMP_POINTER?, BMP_SIZE_X?, BMP_SIZE_Y?, BMP_BPP?)
{
int bitmapsendingresult = ?????
}
Run Code Online (Sandbox Code Playgroud)
它可能是System.Drawing.Bitmap,或者只是一些我将在VB应用程序中转换为System.Drawing.Bitmap的数组.没关系那么重要.
我的问题:
有人可以解释一下,我该怎么办:
在某些环境(如Java)中,使用TCP/IP套接字使用"localhost"地址(IPv4中为127.0.0.1或IPv6中为:: 1)在同一主机上的进程之间传递消息是很自然的.(因为Java倾向于不在其API中公开其他IPC机制).
显然,通过管道传递消息或使用共享内存的IPC,这可能比IPC慢得多.
另一方面,如果TCP/IP网络堆栈意识到连接的两端都在环回接口上,那么它可能能够进行一些优化,这样效率可能与使用管道没有太大差别.
但是,常见的操作系统(Windows,Linux)是否在其TCP/IP堆栈中实现了这样的优化?
我想在几个进程之间使用共享内存,并希望能够继续使用原始指针(和stl容器).
为此,我使用映射在固定地址的共享内存:
segment = new boost::interprocess::managed_shared_memory(
boost::interprocess::open_or_create,
"MySegmentName",
1048576, // alloc size
(void *)0x400000000LL // fixed address
);
Run Code Online (Sandbox Code Playgroud)
选择这个固定地址的好策略是什么?例如,我应该使用一个相当高的数字来减少我用完堆空间的可能性吗?
我有一个循环缓冲区,支持文件映射内存(缓冲区的大小范围为8GB-512GB).
我从开始到结束以顺序的方式写入(8个实例)此内存,此时它循环回到开头.
它工作正常,直到它需要执行两个文件映射并循环内存,此时IO性能完全被破坏并且无法恢复(即使在几分钟后).我无法弄明白.
using namespace boost::interprocess;
class mapping
{
public:
mapping()
{
}
mapping(file_mapping& file, mode_t mode, std::size_t file_size, std::size_t offset, std::size_t size)
: offset_(offset)
, mode_(mode)
{
const auto aligned_size = page_ceil(size + page_size());
const auto aligned_file_size = page_floor(file_size);
const auto aligned_file_offset = page_floor(offset % aligned_file_size);
const auto region1_size = std::min(aligned_size, aligned_file_size - aligned_file_offset);
const auto region2_size = aligned_size - region1_size;
if (region2_size)
{
const auto region1_address = mapped_region(file, read_only, 0, (region1_size + region2_size) * 2).get_address();
const auto region2_address …Run Code Online (Sandbox Code Playgroud) 我想在内存中创建一个映射的二进制文件; 但是我不确定如何创建要映射到系统的文件.我多次阅读文档并意识到有2个映射文件实现,一个在iostream中,另一个在进程间.
你们对如何在共享内存中创建映射文件有任何想法吗?我试图允许多线程程序读取以二进制文件格式写入的大型double数组.iostream中的映射文件和进程间的区别是什么?