我正在尝试每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并将其清除的最佳方法。希望有人做了类似的事情?
答案 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中的threading
受Global Interpreter Lock的限制。线程可以并发运行,但不能并行运行-Python代码只能在一个内核上运行。但是,诸如time.sleep
之类的扩展程序和系统调用以及pandas
的基础数据结构都可以避免这种情况。