python - 在 Python 中排队线程

标签 python multithreading queue

我正在使用 Queue doc page 底部的队列实现,我有几个问题:

  1. 有 50 个线程,它们提取数十万个 JSON 文件。将 Queue(maxsize= 设置为线程数的两倍是个好主意,还是应该更多或更少?

  2. 我想将 worker 函数放在不同的模块中。我该怎么办?当我尝试这样做时,我在函数的 item = q.get() 行中得到 NameError: global name 'q' is not defined ;向函数添加 global q 没有帮助。

编辑:是否可以将工作函数移动到另一个模块,只需对该代码进行最少的更改?我不太了解对象,我希望代码尽可能简单。

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()      

最佳答案

你可以试试这样的东西

class Worker(threading.Thread):
    def __init__(self,inputQueue,inputLock):
        threading.Thread.__init__(self)
        self.inputQueue=inputQueue
        self.inputLock=inputLock          

    def run(self):       
        while True:
            if not self.inputQueue.empty():
                self.inputLock.acquire()
                item=self.inputQueue.get()
                self.inputLock.release()
        #process item
                self.inputQueue.task_done()
            else:
                time.sleep(1)

class Main():

    def __init__(self):
        self.workersQueue = Queue.Queue()
        self.workersLock = threading.RLock()
        self.workers = list()

        #start threads
        for index in range(10):            
            self.uploaders.append(Worker(self.workersQueue, self.workersLock))
            self.uploaders[index].start()

        self.workersQueue.join()

这里的 worker 是一个类(一个线程,队列被共享)。 主类用于创建工作线程,从而加载工作线程所需的数据。

希望对你有帮助

关于python - 在 Python 中排队线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174437/

相关文章:

python - 在 python 中获得大特征向量的最近 10 个欧几里德邻居的最快方法

java - 多线程应用程序性能

java - 多个字段 : volatile or AtomicReference?

python - Eventlet 和 Python 守护进程,Foo 没有被调用?

c - 程序产生错误的输出

sql - 使用数据库表作为队列

python - Plotly-Dash Graph - 显示在形状后面的文本注释

python - 最好是读取整个文件,关闭它,然后遍历它,或者在它打开时循环遍历?

python - 检查对象在列表中是否出现超过 2 次

c++ - Openssl 线程安全回调函数注册,包括直接调用和间接调用