2012-06-11 78 views
0

我有一個我在C中創建的媒體播放器,並且它與我在Python中使用的服務器一起運行。服務器接受命令來修改駐留在SQLite數據庫中的播放列表。將變量從python實時傳遞到C的最佳方式

一旦python代碼更新了數據庫(這種情況發生在媒體播放器正在播放的背景中),它需要讓播放器知道數據庫中有一個新的播放列表,以便它可以開始播放新文件。

我打算在DB中設置一個標誌,玩家可以不斷地輪詢這個標誌,但我不認爲這是最好的方法。我能想到的所有選項都包括媒體播放器經常檢查某些內容。

要做這件事的最好方法是什麼?

+0

[信號](http://docs.python.org/library/signal.html)? –

+1

在redis中使用pub/sub? –

+0

@JakobBowyer:redis很難與媒體播放器捆綁在一起,只是爲了將一些數據從程序A傳輸到程序B,特別是當有更簡單的方法時。 –

回答

5

有很多方法,你可以這樣做:

  1. 信號 - 從Python的發送SIGUSR1信號給玩家。
  2. 套接字 - 播放器偵聽某個端口,Python在該端口上發送一些數據(在這種情況下UDP將是最簡單的)。
  3. Fifo - Linux機器上有mkfifo。以這種方式創建的文件與套接字類似。

我會推薦UDP套接字。它比信號容易,快速和優雅。 Python代碼將是關於3行代碼的東西。

例Python代碼:

sock = socket.socket() 
sock.connect(('localhost', 9999)) 
sock.sendall('update') 
sock.close() 

例C UDP服務器: http://www.cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/udp-server.c

+0

+1,它也很好提及http://redis.io/topics/pubsub,它也是優雅的消息傳遞方式,你有紅利'redis' :) – jackdoe

+1

如果你有更復雜的情況(即多個玩家和多個Python腳本)或者你已經在使用'redis'到別的東西了''redis'會使你感覺不舒服。在這種情況下,它的超調,因爲其實施起來要複雜得多(適當配置'redis'可能需要比完整的UPD或信號實現花費更多的時間)並且難以維護。此外,這看起來像桌面解決方案,所以你可能不想設置'redis'(作者甚至不想設置數據庫服務器,而是使用SQLite代替)。 –

+0

+1插座。他們就像魔術一樣。 – deadly

相關問題