Skip to main content
 首页 » 编程设计

python之在 Python 中排队线程

2025年05月04日8fff_TT

我正在使用 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 是一个类(一个线程,队列被共享)。 主类用于创建工作线程,从而加载工作线程所需的数据。

希望对你有帮助