在Python中查询线程

在Python中查询线程,python,multithreading,queue,Python,Multithreading,Queue,我从底层使用队列实现,我有几个问题: 有50个线程,它们获取数十万个JSON文件。将队列(maxsize=设置为线程数的两倍是一个好主意,还是应该增加或减少线程数 我想把worker函数放在另一个模块中。我该怎么做?当我尝试这样做时,我得到了NameError:全局名称“q”没有定义在函数的item=q.get()行中;将global q添加到函数中没有帮助 编辑:是否可以将辅助函数移动到另一个模块,对该代码的更改最少?我对对象的理解不是很好,我希望代码尽可能简单 def worker():

我从底层使用队列实现,我有几个问题:

  • 有50个线程,它们获取数十万个JSON文件。将
    队列(maxsize=
    设置为线程数的两倍是一个好主意,还是应该增加或减少线程数

  • 我想把
    worker
    函数放在另一个模块中。我该怎么做?当我尝试这样做时,我得到了
    NameError:全局名称“q”没有定义在函数的
    item=q.get()
    行中;将
    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是一个类(一个线程,队列共享到该线程)。 主类用于创建辅助线程,从而加载辅助线程所需的数据


    希望这会有所帮助

    您是否需要设置maxsize取决于您如何填充队列,以及您是在队列中存储数据还是仅在队列中存储引用。我会将maxsize设置为队列内存占用而不是线程数的函数。如果您真的有几十万个内存占用小的队列项目(例如,带有文件名的字符串)您应该将其设置得足够高,这样队列就不会耗尽项目。在这种情况下,我使用1000。如果您想使用多个处理器,顺便提一下,您应该使用多处理器队列模块。例如:它会以任何方式提高性能吗?我假设主要瓶颈是净延迟。而队列项目只是长整数s、 这一切都取决于应用程序的具体情况。我只想指出,如果您坚持使用队列模块,您在给定的时间内不会使用多个cpu内核。这对您的应用程序来说可能是可以接受的。不必使用锁。
    Queue.Queue
    以线程安全的方式实现其操作。谢谢,我同意嗯,我会试试,作为最后的办法。