Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实时将变量从python传递到C的最佳方法_Python_C_Variables_Media Player - Fatal编程技术网

实时将变量从python传递到C的最佳方法

实时将变量从python传递到C的最佳方法,python,c,variables,media-player,Python,C,Variables,Media Player,我有一个用C语言创建的媒体播放器,它在Python中的服务器旁运行。服务器接受命令来修改驻留在SQLite数据库中的播放列表 一旦python代码更新了数据库(这在媒体播放器播放时发生在后台),它需要让播放器知道数据库中有一个新的播放列表,以便开始播放新文件 我打算在DB中设置一个标志,玩家可以不断地轮询这个标志,但我认为这不是最好的方式。我能想到的所有选项都涉及到媒体播放器不断地检查一些东西 最好的方法是什么?有很多方法可以做到这一点: 信号-从Python向播放器发送SIGUSR1信号 套接

我有一个用C语言创建的媒体播放器,它在Python中的服务器旁运行。服务器接受命令来修改驻留在SQLite数据库中的播放列表

一旦python代码更新了数据库(这在媒体播放器播放时发生在后台),它需要让播放器知道数据库中有一个新的播放列表,以便开始播放新文件

我打算在DB中设置一个标志,玩家可以不断地轮询这个标志,但我认为这不是最好的方式。我能想到的所有选项都涉及到媒体播放器不断地检查一些东西


最好的方法是什么?

有很多方法可以做到这一点:

  • 信号-从Python向播放器发送SIGUSR1信号
  • 套接字-播放器监听某个端口,Python在该端口发送一些数据(在这种情况下,UDP将是最简单的)
  • Fifo-Linux机器上有
    mkfifo
    。以这种方式创建的文件与套接字类似
  • 我建议使用UDP套接字。它比信号简单、快速、优雅。Python代码大约是3行代码

    Python代码示例:

    示例C UDP服务器:

    有很多方法可以做到这一点:

  • 信号-从Python向播放器发送SIGUSR1信号
  • 套接字-播放器监听某个端口,Python在该端口发送一些数据(在这种情况下,UDP将是最简单的)
  • Fifo-Linux机器上有
    mkfifo
    。以这种方式创建的文件与套接字类似
  • 我建议使用UDP套接字。它比信号简单、快速、优雅。Python代码大约是3行代码

    Python代码示例:

    示例C UDP服务器:

    ?@JakobBowyer:redis很难与媒体播放器捆绑在一起,只是为了将一点数据从程序a传输到程序B,特别是当有更简单的方法时。如果您使用linux@DietrichEpp我将twisted捆绑到我写的IDE中?@JakobBowyer:redis很难与媒体播放器捆绑在一起,只是为了将一点数据从程序a传输到程序B,特别是当有更简单的方法时。如果您使用linux@DietrichEpp我将twisted捆绑到我编写的IDE+1中,这也是一个很好的说明,它也是一种优雅的消息传递方式,您有额外的奖励
    redis
    :)
    redis
    如果您有更复杂的情况,它是有意义的(即,多个播放器和多个Python脚本)或者您已经在使用
    redis
    进行其他操作。在这种情况下,由于实现起来要复杂得多(正确配置
    redis
    可能需要比完整的UPD或信号实现更多的时间)而且更难维护。而且这看起来像桌面解决方案,所以您可能不想安装
    redis
    (作者甚至不想安装DB server,而是使用SQLite).Unix域套接字可能比UDP套接字稍微容易一些,因为您不必选择端口号,而且它们保证了传输。代码几乎是一样的。@DietrichEpp Unix套接字:优点-更快,无需选择端口,保证传输,缺点-您必须处理播放器未运行时的情况,您需要要将套接字放入的目录(/tmp很好,但并不完美),您必须管理权限,无法轻松地移动到Windows,您必须在Python尝试连接之前创建套接字。IMO:UDP对初学者来说更容易,unix套接字更优雅。它将只在Debian ARM上运行。您能给出unix套接字方法的示例/链接吗?+1,这也很好地提及,它也是消息pa的优雅方式如果你有更复杂的情况(即多个玩家和多个Python脚本),或者你已经在使用
    redis
    ,那么你就有了奖金
    redis
    :)
    redis
    。在这种情况下,它的超调,因为它的实现要复杂得多(正确配置
    redis
    可能需要比完整的UPD或信号实现更多的时间),并且更难维护。另外,这看起来像桌面解决方案,所以您可能不想安装redis(作者甚至不想安装DB server,而是使用SQLite)。Unix域套接字可能比UDP套接字稍微容易一些,因为您不必选择端口号,而且它们保证了交付。代码几乎是一样的。@DietrichEpp unix套接字:优点-更快,无需选择端口,保证交付,缺点-您必须处理播放器未运行时的情况,您需要将套接字放入目录(/tmp很好,但并不完美),您必须管理权限,无法轻松移动到Windows,在Python尝试连接之前,必须先创建套接字。IMO:UDP对于初学者来说更容易,unix套接字更优雅。它将只在Debian ARM上运行。您能给出unix套接字方法的示例/链接吗?
    sock = socket.socket()
    sock.connect(('localhost', 9999))
    sock.sendall('update')
    sock.close()