2014-03-19 33 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”并且然后被锁定直到第一个完成。