import time
from flask import Flask, jsonify
from multiprocessing import Process, Value
app = Flask(__name__)
class Queue:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def enqueue(self, item):
self.items.insert(0,item)
def dequeue(self):
return self.items.pop()
def size(self):
return len(self.items)
tasks = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
q = Queue()
@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
q.enqueue('cat')
print("Size: " + str(q.size()))
return jsonify({'tasks': tasks})
def record_loop(loop_on):
while True:
if loop_on.value == True:
print("loop running")
q.enqueue('dog')
print("Size: " + str(q.size()))
time.sleep(1)
if __name__ == "__main__":
recording_on = Value('b', True)
p = Process(target=record_loop, args=(recording_on,))
p.start()
app.run(debug=True, use_reloader=False)
p.join()
我有一个名为queue的全局类。队列的数据在两个不同的功能之间共享,但它不起作用。
为什么队列在函数' get_tasks()'大小总是等于1?我认为队列是线程安全的,它们可以在不同的进程之间共享?
答案 0 :(得分:2)
创建新流程时,它会复制当前环境并在新环境中重新创建。创建流程后,将不再共享这些全局变量。
但是,multiprocessing
库已包含communicate between processes
您仍然可以使用队列,但是您必须使用多处理Queue而不是您的家庭滚动队列。在引擎盖下,每个进程都有自己的Queue
对象,它们只是简单地在进程之间来回传递信息以同步队列状态。