如何定期从守护进程向多个线程分发dict()? (蟒蛇)

时间:2018-01-23 10:46:49

标签: python multithreading

我有一个循环守护线程从Web套接字接收数据,用值更新dict()。守护进程必须不断运行更新以实时保存数据。但是,我的其他线程(不同于1-15个其他线程或进程)只需要定期更新。如何从守护程序线程获取dict()并定期将dict()分发给许多其他线程或进程?有没有一种简单的方法可以做到这一点我想念?提前谢谢。

我的示例代码使用锁不可靠地为dict提供一个线程:

import time
import threading as t
from datetime import datetime

def updater(mydict,period,m):

    while True:
        # Continualy updates data to dict from websocket here

        data = int(str(datetime.now())[17:19]) # Test Data

        # Every 5 seconds: updates manager dict (unreliable)
        if int(str(datetime.now())[17:19])%period == 0:
            mydict['data'] = data
            m.release()
            time.sleep(1)


def calculator(mydict,period,m):

    # Every loop calls fresh data and does calculations
    while True:
        m.acquire()
        data = mydict

        # Calculations here.

        # Printing test code here.
        print ("Time: ", int(str(datetime.now())[17:19]))
        print ("Data: ", data)
        time.sleep(period)

if __name__ == '__main__':        
    m = t.Lock()
    m.acquire()
    dict = {}
    period = 5
    bot_process = t.Thread(target= updater, args= (dict,period,m))
    update_process = t.Thread(target= calculator, args= (dict,period,m))
    update_process.daemon = True
    update_process.start()
    bot_process.start()

要使代码工作,这意味着计算器会有一对一更新程序,但我希望所有计算器只有一个更新程序。

1 个答案:

答案 0 :(得分:0)

看起来你的calculator函数只是来自dict的读取,而不是写入它。这对于你想要的多个线程来说应该是绝对正确的。在这种情况下,您可以完全取消锁定。

但是,如果你想寻求更成熟的解决方案;我建议考虑使用数据库。 updater可以在表格中创建条目,calculator可以对其进行操作。数据库引擎意味着同时被许多连接使用,同时保持一致,所以问题现在已经无法掌握。