我有一个带有两个进程的应用程序,一个在C中,一个在Python中.C进程是完成所有繁重工作的地方,而Python进程则处理用户界面.
C程序每秒写入4次大型缓冲区,Python进程读取此数据.到目前为止,AMQP已经完成了与Python进程的通信.我更愿意在两个进程之间设置一些内存共享,以减少开销并提高性能.
我有什么选择?理想情况下,我只是简单地让Python进程直接读取物理内存(最好是从内存而不是磁盘),然后用信号量或类似的东西来处理竞争条件.然而,这是我几乎没有经验的东西,所以我很感激我能得到的任何帮助.
我正在使用Linux btw.
这个问题已经问了很长时间了。我相信提问者已经有了答案,所以我写了这个答案给后来的人。
/*C code*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define GETEKYDIR ("/tmp")
#define PROJECTID (2333)
#define SHMSIZE (1024)
void err_exit(char *buf) {
fprintf(stderr, "%s\n", buf);
exit(1);
}
int
main(int argc, char **argv)
{
key_t key = ftok(GETEKYDIR, PROJECTID);
if ( key < 0 )
err_exit("ftok error");
int shmid;
shmid = shmget(key, SHMSIZE, IPC_CREAT | IPC_EXCL | 0664);
if ( shmid == -1 ) {
if ( errno == EEXIST ) {
printf("shared memeory already exist\n");
shmid = shmget(key ,0, 0);
printf("reference shmid = %d\n", shmid);
} else {
perror("errno");
err_exit("shmget error");
}
}
char *addr;
/* Do not to specific the address to attach
* and attach for read & write*/
if ( (addr = shmat(shmid, 0, 0) ) == (void*)-1) {
if (shmctl(shmid, IPC_RMID, NULL) == -1)
err_exit("shmctl error");
else {
printf("Attach shared memory failed\n");
printf("remove shared memory identifier successful\n");
}
err_exit("shmat error");
}
strcpy( addr, "Shared memory test\n" );
printf("Enter to exit");
getchar();
if ( shmdt(addr) < 0)
err_exit("shmdt error");
if (shmctl(shmid, IPC_RMID, NULL) == -1)
err_exit("shmctl error");
else {
printf("Finally\n");
printf("remove shared memory identifier successful\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#python
# Install sysv_ipc module firstly if you don't have this
import sysv_ipc as ipc
def main():
path = "/tmp"
key = ipc.ftok(path, 2333)
shm = ipc.SharedMemory(key, 0, 0)
#I found if we do not attach ourselves
#it will attach as ReadOnly.
shm.attach(0,0)
buf = shm.read(19)
print(buf)
shm.detach()
pass
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
C程序需要首先执行,不要在python代码执行前停止它,它会创建共享内存段并向其中写入一些内容。然后 Python 代码附加相同的段并从中读取数据。
完成所有事情后,按回车键停止 C 程序并删除共享内存 ID。
我们可以在这里看到更多关于 SharedMemory for python:http : //semanchuk.com/philip/sysv_ipc/#shared_memory
用 C 语言将举重代码编写为库,然后提供一个 Python 模块作为其包装器怎么样?这实际上是一种非常常见的方法,特别是它允许在 Python 中进行原型设计和分析,然后将性能关键部分转移到 C。
如果您确实有理由需要两个进程,Python 中有一个 XMLRPC 包应该可以促进此类 IPC 任务。无论如何,使用现有的框架而不是发明自己的 IPC,除非你确实能够证明性能需要它。
| 归档时间: |
|
| 查看次数: |
7161 次 |
| 最近记录: |