2014-03-19 34 views
2

我目前有一個餐廳模擬程序,Tkinter的GUI,我正在尋找一種方法來允許程序的多個實例化在某種意義上彼此交互更新其關鍵變量。 (對不起,我英文不好)程序的多重實例化(Python2.7&Tkinter)

比方說:

  • 五個用戶已經使用同一臺電腦同時打開此程序。 (假設)
  • 有三種功能於一體的節目,即OrderSee InventorySee Sales
  • 假定所有五人作出的命令

現在,餐廳必須跟蹤所做的訂單,和烹飪食物的庫存。

我試着使用txt文件導入和導出來跟蹤數據,但是現在我才意識到txt文件可以被程序一次性編輯。 (不能同時修改單txt文件)

問:什麼是儲蓄在程序中使用,以便多個用戶可以使用帶有變量的實時更新的值程序中的變量的值的更好的辦法?

  • 有人告訴我,我可以嘗試使用Global變量。但是,我怎麼可能爲他們分配值並保持更新呢? (當程序運行時,局部變量每次被初始化)

謝謝你閱讀我的問題!

+0

查看'multiprocessing'和代理特別是。你也可以看看Pyro。這裏有一個可以指導你的答案:http://stackoverflow.com/questions/21642880/python-implementing-simple-web-data-storage/21644326#21644326 – User

+0

@用戶感謝您分享鏈接!但我想知道如何在沒有服務器的幫助下做到這一點:) – user3404844

+1

因爲你可以。以下是關於如何使用任何服務器的一篇論文:[Paxos Made Simple](http://research.microsoft.com/en-us/um/people/lamport/pubs/pubs.html#paxos-simple)那麼在分佈式容錯系統的情況下,我想。我喜歡無服務器的點對點解決方案,但他們似乎很難做到正確。這就是很多人使用服務器的原因。 – User

回答

0

您可以使用sqlite3模塊創建輕量級數據庫。這不需要服務器程序;數據庫管理器在Python標準庫中。多個實例會讀/寫同一個文件數據庫,並且sqlite會負責確保一致性。

但是,請注意,是5-second global lock on most sqlite implementations,所以你的任何多個實例的必須完成它的讀/在不到那個時候寫的,否則會造成「數據庫鎖定」例外中的其他實例。

這裏有一個例子:

import sqlite3 as lite 
import time 


con = lite.connect('common.db') 
cur = con.cursor() 
cur.execute(
    "CREATE TABLE IF NOT EXISTS restaurant (orderId INT primary key, inventory TEXT, sales INT);") 

for i in range(5): 
    print "About to insert on ID: %s" % i 
    cur.execute("INSERT INTO restaurant VALUES(%d, 'burger', 1)" % i) 
    time.sleep(1) 

con.close() 

如果執行在同一時間兩個終端這段代碼,你會發現:

  1. 一個「common.db」文件被創建
  2. 兩人之一執行自由進展;另一個進展到「關於在ID上插入:0」並且然後被鎖定直到第一個完成。