我想知道,这是在PHP中将数据从一个进程发送到另一个进程的最快方法吗?数据只是一个短字符串.Curretly我有一个开发了AF_UNIX套接字的解决方案,但基准测试显示将数据从一个进程传递到另一个进程需要0.100毫秒.我想知道,如果共享内存可以更快吗?但是,我不知道,如果有任何新的数据写入,如何让其他进程定期检查共享内存来检测?
当前解决方案
$server = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_bind($server, '/tmp/mysock');
socket_listen($server);
while(true) {
$r = $clients;
if(socket_select($r, $w, $e, 5) > 0) {
$client = socket_accept($server);
$d = trim(socket_read($client, 256, PHP_NORMAL_READ));
echo (microtime(true)-$d)."\n";
socket_close($client);
}
flush();
}
socket_close($server);
Run Code Online (Sandbox Code Playgroud)
和客户:
$d = microtime(true)."\n";
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
socket_connect($socket, '/tmp/mysock');
socket_write($socket, $d, strlen($d));
socket_close($socket);
Run Code Online (Sandbox Code Playgroud)
这个解决方案完全正常,很好,但结果是这样的:
0.00019216537475586
9.5129013061523E-5
0.00011920928955078
0.00011801719665527
7.6055526733398E-5
Run Code Online (Sandbox Code Playgroud)
任何想法,如何使这个脚本更快或开发更快(可能是共享内存)的解决方案?
在此先感谢,乔纳斯
我一直在谷歌上搜索这个,并没有找到明确的答案,所以我希望有人对 Windows VS linux 中的共享内存段有一些了解。
在 Linux 中有两种为 IPC 创建共享内存的方法:共享内存段(shmget 等)和内存映射文件(mmap)。根据我的简要理解,mmap 要求您在操作系统中的某处有一个实际文件进行映射,而共享内存段只是内存中可以由进程附加到的基于名称的段。
在 Windows 中,似乎只有内存映射文件等价于您必须在某处浮动的实际文件。
我的问题:这实际上是 Windows 中唯一的共享内存,还是它有用于创建非基于文件的共享内存段的 api。
我已经在 Ubuntu 12.04 上安装了 docker 0.11.1。当我运行以下命令时,我试图将 shmmax 从其固定值 (32 M) 更改为更大 (1G) 的值(1G):
sysctl -w kernel.shmmax=1073741824
error: "Read-only file system" setting key "kernel.shmmax"
Run Code Online (Sandbox Code Playgroud)
那是因为/proc安装ro在容器中。
有人能告诉我如何r/w在我的容器中安装 proc来更改它吗?
我在 Windows 上运行的 C++ 程序中有一个结构,我想使用 ctypes 通过 Python 中的共享内存来访问该结构。例如:
#define MAX_ENTITIES 30
struct State
{
double x;
double y;
double z;
};
struct Stat
{
unsigned int numAvailable;
unsigned int numUsed;
};
struct TransferData
{
double exLg;
float other;
unsigned int more;
int more2;
unsigned char next;
bool statusReady;
Stat status;
State entities[MAX_ENTITIES];
};
Run Code Online (Sandbox Code Playgroud)
作为:
import ctypes
MAX_ENTITIES = 30
class State(ctypes.Structure):
_fields_ = [
('x', ctypes.c_double),
('y', ctypes.c_double),
('z', ctypes.c_double)
]
class Stat(ctypes.Structure):
_fields_ = [
('numAvailable', ctypes.c_uint),
('numUsed', …Run Code Online (Sandbox Code Playgroud) 我读到进程在单独的内存空间(链接)上运行。然而,python 的 multiprocessing 包提供了共享内存(multiprocessing.Value、multiprocessing.Array)。
我正在设置两个 docker 容器 - 一个作为服务器将数据保存在内存中,另一个作为客户端来访问该数据。为了做到这一点,我相信我需要使用该--ipc标志在容器之间共享内存。Docker文档--ipc很好地解释了该标志。根据正在运行的文档,对我来说有意义的是:
docker run -d --ipc=shareable data-server
docker run -d --ipc=container:data-server data-client
Run Code Online (Sandbox Code Playgroud)
但我读过的所有 Stackoverflow 问题(1、2、3、4 )都将两个容器直接链接到主机:
docker run -d --ipc=host data-server
docker run -d --ipc=host data-client
Run Code Online (Sandbox Code Playgroud)
哪个更适合这个用例?如果ipc=host更好,什么时候使用ipc=shareable?
On Ubuntu 18.04, 当我跑步时
$ df -h,
我看到这个结果:
Filesystem Size Used Avail Use% Mounted on
...
tmpfs 3,9G 73M 3,8G 2% /dev/shm
...
Run Code Online (Sandbox Code Playgroud)
/dev/shm 有3.9G大小。
我怎么能改变的大小/dev/shm?
我的应用程序从外部源接收数据并将其分组(匹配组项目并将结果显示为 HTML 表格,高达 20k 消息/秒)。
问题是共享内存:应用程序实时工作,我收到带有“创建、更新、删除”标志的消息,因此我将所有内容存储在 RAM 中,不需要任何数据库。但是,当我尝试集群时,某些集群会丢失我的应用程序消息(我尝试使用pm2进行集群)。
因此,现在我尝试使用 WorkerThreads 扩展我的应用程序,但是通过通信parentPort.postMessage/worker.postMessage需要对应用程序进行大量更改。所以现在我尝试通过共享内存SharedArrayBuffer,但我不明白如何在主机和工作人员之间共享对象数组。
const {
Worker, isMainThread, parentPort, workerData
} = require('worker_threads');
if (isMainThread) {
const sab = new SharedArrayBuffer(1024);
sab[0] = {foo: 'bar'};
const worker = new Worker(__filename, {
workerData: sab
});
setInterval(() => {
console.log( sab[0] ); // always {foo: 'bar'}
}, 500);
} else {
let sab = workerData;
sab.foo = false; // changing "foo" value at worker but not in main thread …Run Code Online (Sandbox Code Playgroud) 该函数store_in_shm将 numpy 数组写入共享内存,而第二个函数read_from_shm使用同一共享内存空间中的数据创建 numpy 数组并返回 numpy 数组。
但是,在 Python 3.8 中运行代码会出现以下分段错误:
zsh:分段错误 python foo.py
为什么从函数内部访问numpy数组没有问题read_from_shm,但在函数外部再次访问numpy数组时出现分段错误?
输出:
From read_from_shm(): [0 1 2 3 4 5 6 7 8 9]
zsh: segmentation fault python foo.py
% /Users/athena/opt/anaconda3/envs/test/lib/python3.8/multiprocessing/resource_tracker.py:203: UserWarning: resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown
warnings.warn('resource_tracker: There appear to be %d '
Run Code Online (Sandbox Code Playgroud)
foo.py
import numpy as np
from multiprocessing import shared_memory
def store_in_shm(data):
shm = shared_memory.SharedMemory(name='foo', create=True, size=data.nbytes)
shmData …Run Code Online (Sandbox Code Playgroud) 在 Python 3.8+ 中,是否可以检查 numpy 数组是否存储在共享内存中?
在以下示例中,sharedArr使用对象的缓冲区创建了一个 numpy 数组multiprocessing.shared_memory.SharedMemory。想知道是否可以写一个函数来检测是否SharedMemory被使用。
import numpy as np
from multiprocessing import shared_memory
if __name__ == '__main__':
# Created numpy array `sharedArr`in shared memory
arr = np.zeros(5)
shm = shared_memory.SharedMemory(create=True, size=arr.nbytes)
sharedArr = np.ndarray(arr.shape, dtype=arr.dtype, buffer=shm.buf)
sharedArr[:] = arr[:]
# How to tell if numpy array is stored in shared memory?
print(type(sharedArr)) # <class 'numpy.ndarray'>
print(hex(id(sharedArr))) # 0x7fac99469f30
shm.close()
shm.unlink()
Run Code Online (Sandbox Code Playgroud)