【问题标题】:C semaphore from Python来自 Python 的 C 信号量
【发布时间】: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 问题。

标签: python c ipc semaphore


【解决方案1】:
write(fd, tempBuff, sizeof(tempBuff));

以上行仅将 tempBuff 中 4/8 字节(32 位/64 位)的数据写入管道

如果要在tempBuff内写入所有数据,需要将行改为

write(fd, tempBuff, sizeof(SAMPLE)*FRAME_SIZE);

【讨论】:

  • 谢谢,但是有什么方法可以使用 python 中的 signal() 类型的函数来增加 C 中的 s 变量?我的意思是它甚至可能吗?这实际上解决了我的问题,但通过这个实现,我想了解如何从 Python 脚本处理 C 信号量。谢谢!
  • @AshishK 您在 C 代码中拥有的不是可用的信号量,所以现在最好忘记这一点。
  • @FelixPalmen 好的。非常感谢您的宝贵时间,我很感激 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多