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