Python 中的多处理:处理多个工作线程
Multiprocessing in Python : Handle Multiple Worker Threads
在我的代码中,我需要在 python 程序中有多个工作线程实例 运行ning。我最初创建了几个工作线程实例(比如 10 个),然后将它们添加到池中。每当客户端请求服务时,都应为客户端调用并保留一个线程。完成任务后,线程应该添加回池中。
到目前为止,我已经编写了以下代码。但我不确定 如何 运行 线程永远在池中(它们应该在池中休眠),在需要时调用并获取服务并将它们添加回池中(应该休眠再次)处理后。任何帮助将不胜感激。
PRED = Queue(10)
class Worker(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID =threadID
self.name = name
def run(self):
print("starting " + self.name + " thread")
while True:
??
print("Exiting " + self.name + " thread")
def work():
print("working")
time.sleep(3)
- 假设工作线程在 PRED 队列中。
- work() 是我应该调用来为客户服务的方法。
使用任务队列将任务发送给您的工作人员。让您的工作人员收听任务队列并等待它是否为空。当工作人员从队列中获取任务时,它应该执行它然后返回轮询队列。相当标准的工人模式。
当我说任务时,我的意思是您可以将实际方法放入队列中。工人可以拿起它并执行它。
这是我从 Python 文档中得出的内容
read more: https://docs.python.org/3/library/queue.html#queue.Queue.join
请确保您已仔细阅读它,其中有一些很酷的选项,例如创建优先级队列或先进先出,或后进先出。
import queue
import threading
import time
# The queue for tasks
q = queue.Queue()
# Worker, handles each task
def worker():
while True:
item = q.get()
if item is None:
break
print("Working on", item)
time.sleep(1)
q.task_done()
def start_workers(worker_pool=1000):
threads = []
for i in range(worker_pool):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
return threads
def stop_workers(threads):
# stop workers
for i in threads:
q.put(None)
for t in threads:
t.join()
def create_queue(task_items):
for item in task_items:
q.put(item)
if __name__ == "__main__":
# Dummy tasks
tasks = [item for item in range(1000)]
# Start up your workers
workers = start_workers(worker_pool=10)
create_queue(tasks)
# Blocks until all tasks are complete
q.join()
stop_workers(workers)
在我的代码中,我需要在 python 程序中有多个工作线程实例 运行ning。我最初创建了几个工作线程实例(比如 10 个),然后将它们添加到池中。每当客户端请求服务时,都应为客户端调用并保留一个线程。完成任务后,线程应该添加回池中。
到目前为止,我已经编写了以下代码。但我不确定 如何 运行 线程永远在池中(它们应该在池中休眠),在需要时调用并获取服务并将它们添加回池中(应该休眠再次)处理后。任何帮助将不胜感激。
PRED = Queue(10)
class Worker(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID =threadID
self.name = name
def run(self):
print("starting " + self.name + " thread")
while True:
??
print("Exiting " + self.name + " thread")
def work():
print("working")
time.sleep(3)
- 假设工作线程在 PRED 队列中。
- work() 是我应该调用来为客户服务的方法。
使用任务队列将任务发送给您的工作人员。让您的工作人员收听任务队列并等待它是否为空。当工作人员从队列中获取任务时,它应该执行它然后返回轮询队列。相当标准的工人模式。
当我说任务时,我的意思是您可以将实际方法放入队列中。工人可以拿起它并执行它。
这是我从 Python 文档中得出的内容
read more: https://docs.python.org/3/library/queue.html#queue.Queue.join
请确保您已仔细阅读它,其中有一些很酷的选项,例如创建优先级队列或先进先出,或后进先出。
import queue
import threading
import time
# The queue for tasks
q = queue.Queue()
# Worker, handles each task
def worker():
while True:
item = q.get()
if item is None:
break
print("Working on", item)
time.sleep(1)
q.task_done()
def start_workers(worker_pool=1000):
threads = []
for i in range(worker_pool):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
return threads
def stop_workers(threads):
# stop workers
for i in threads:
q.put(None)
for t in threads:
t.join()
def create_queue(task_items):
for item in task_items:
q.put(item)
if __name__ == "__main__":
# Dummy tasks
tasks = [item for item in range(1000)]
# Start up your workers
workers = start_workers(worker_pool=10)
create_queue(tasks)
# Blocks until all tasks are complete
q.join()
stop_workers(workers)