【发布时间】:2017-12-17 19:42:22
【问题描述】:
我有一个 C 代码,其中我使用信号量实现了锁定机制。基本流程如下-
int s=1;
void wait(){
while(s<=0);
s--;
}
void pipeData(paTestData *data){
wait();
SAMPLE *tempBuff = (SAMPLE*)malloc(sizeof(SAMPLE)*FRAME_SIZE);
int readCount = FRAME_SIZE;
while(readCount > 0){
tempBuff[FRAME_SIZE - readCount] = data->sampleValues[data->readFromCB];
data->readFromCB++;
readCount--;
}
fd = open(fifoPipe, O_WRONLY);
write(fd, tempBuff, sizeof(tempBuff));
close(fd);
free(tempBuff);
}
int callBack(){
// Perform data acquisition and call foo
foo();
// Rest code here
}
阅读器端的python代码如下:
with open(FIFO, 'rb') as fifo:
print("Pipe opened")
count=0
while count<framelen:
Rsample = fifo.read()
frame = np.fromstring(Rsample,dtype=np.float32)
if (len(frame)>0):
print(frame)
count=count + len(frame)
PIPE 另一端的数据正在由 Python 脚本处理。问题是在python端读取PIPE无法获取完整的数据集。
这是因为我已经阅读了 named PIPE 对于每次写入,都应该有一个读取器,否则在下一次迭代期间打开的管道会被阻塞。
在这种情况下,将10 samples 写入PIPE 后,python 的阅读器实现能够read only first two samples 并且PIPE 可以随时用于下一个写入集。
这就是我寻找locking mechanism 的原因。
我的疑问是 -
1) 有没有一种方法可以增加 s 变量(有点像 C 中的 signal() 函数会做什么)每次 python 脚本 已完成从 PIPE 轮询所有数据。
2) 有没有其他顺利实现过这样的问题,有没有 C 和 Python 之间的其他 IPC 技术启用锁定机制?
谢谢!
【问题讨论】:
-
我认为您需要更好地解释您的实际问题。你在等什么条件?写入管道没有问题,只要管道缓冲区满,它就会阻塞。除此之外,您的信号量实现不是原子的,因此它或多或少对并发无用。
-
同步进程的一个简单解决方案是使用更多管道,其中 信号 将单个字符写入该管道(而另一端处于阻塞读取状态)跨度>
-
我没有看到任何管道代码。你说你在“轮询”,那么你使用的是非阻塞管道吗?你看过新的异步模块吗? docs.python.org/3/library/asyncio-sync.html#asyncio.Semaphore
-
@FelixPalmen 我认为使用另一个
PIPE可以解决问题。实施后会通知您。谢谢! -
信号量和许多其他这样的线程间信号,不能在操作系统内核之外实现,因为线程不能在用户空间中被阻塞。那,以及其他评论者提到的 XY 问题。