Python共享队列 - 2个不同的线程

时间:2018-03-06 00:14:02

标签: python flask concurrency queue

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?我认为队列是线程安全的,它们可以在不同的进程之间共享?

1 个答案:

答案 0 :(得分:2)

创建新流程时,它会复制当前环境并在新环境中重新创建。创建流程后,将不再共享这些全局变量。

但是,multiprocessing库已包含communicate between processes

的方法

您仍然可以使用队列,但是您必须使用多处理Queue而不是您的家庭滚动队列。在引擎盖下,每个进程都有自己的Queue对象,它们只是简单地在进程之间来回传递信息以同步队列状态。