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

问题描述 投票:2回答:1
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?我认为队列是线程安全的,它们可以在不同的进程之间共享?

python flask concurrency queue
1个回答
2
投票

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

然而,multiprocessing图书馆已经包括了communicate between processes的方法

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

© www.soinside.com 2019 - 2024. All rights reserved.