每x秒加载一次dict,然后传递给df并清除dict

时间:2018-09-06 14:05:52

标签: python

我正在尝试每5秒将值写入字典1分钟。然后,我想获取这些值并将其放入数据帧中以写入csv并清除原始字典并继续进行。

import time
import random
from multiprocessing import Process

a = {'value':[], 'timeStamp': []}

def func1():
    global a
    print "starting First Function"
    a['value'].append(random.randint(1,101))
    a['timeStamp'].append(time.time()*1000.0)
    time.sleep(5)
    return a

def func2():
    print "starting Second Function"
    time.sleep(60)
    d = pd.DataFrame(a)
    print d
    # here i would write out the df to csv and del d
    a.update({}.fromkeys(a,0))
    print "cleared"


if __name__=='__main__':
while True:
    p1 = Process(target = func1)
    p1.start()
    p2 = Process(target = func2)
    p2.start()
    p1.join()
    p2.join()
    print "test"
    print a

这就是我现在所在的位置,这可能是正确的方法,也可能不是正确的方法。无论如何,这段代码并没有给我正确的结果。我正在尝试找出将dict放入df并将其清除的最佳方法。希望有人做了类似的事情?

2 个答案:

答案 0 :(得分:1)

您的代码有很多问题,几乎不适合任何使用。您可以使用如下代码(Python 3,线程而不是进程)开始研究:

import time
import random
import threading

def func1(a):
    print("starting First Function")
    for dummy in range(10):
        a['value'].append(random.randint(1, 101))
        a['timeStamp'].append(time.time() * 1000.0)
        time.sleep(1)
    print("stopping First Function")


def func2(a):
    print("starting Second Function")
    for dummy in range(2):
        time.sleep(5)
        print(a)
        a['value'] = list()
        a['timeStamp'] = list()
        print("cleared")
    print('stopping Second Function')


if __name__ == '__main__':

    a = {'value': list(), 'timeStamp': list()}

    t1 = threading.Thread(target=func1, args=(a,))
    t1.start()
    t2 = threading.Thread(target=func2, args=(a,))
    t2.start()

输出为:

starting First Function
starting Second Function
{'value': [32, 95, 2, 71, 65], 'timeStamp': [1536244351577.3914, 1536244352584.13, 1536244353586.6367, 1536244354589.3767, 1536244355591.9202]}
cleared
{'value': [43, 44, 28, 69, 25], 'timeStamp': [1536244356594.6294, 1536244357597.2498, 1536244358599.9812, 1536244359602.9592, 1536244360605.9316]}
cleared
stopping Second Function
stopping First Function

答案 1 :(得分:1)

进程不共享内存-每个函数修改一个单独 a。因此,在功能和主要过程中看不到更改。

要在功能之间共享内存,请改用threading模块。您可以在示例中对此进行测试,方法是将Process替换为Thread

from threading import Thread as Process

这可以使您的示例保持不变。


请注意,Python中的threadingGlobal Interpreter Lock的限制。线程可以并发运行,但不能并行运行-Python代码只能在一个内核上运行。但是,诸如time.sleep之类的扩展程序和系统调用以及pandas的基础数据结构都可以避免这种情况。