我找到了一段演示 python 3 中多线程工作的代码。我想让我的函数在每个线程中执行,在所有线程完成后,我得到一个包含所有线程结果的数组
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
#здесь должна выполниться моя функция я записать результат в массив
result = subprocess.run(['command', 'arg1', 'arg2'], stdout=subprocess.PIPE)
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(10)]
# Start up your workers
workers = start_workers(worker_pool=10)
create_queue(tasks)
# Blocks until all tasks are complete
result = q.join()
print(result)
result2 = worker.join()
print(result2)
stop_workers(workers)
multiprocessing.dummy- 线程接口,重复 apimultiprocessing。该函数map大大简化了数组的处理。队列、等待、运行的 worker 已经实现。
最简单的方法可能是创建另一个队列来存储结果(队列是线程安全的):
通常,不等到 pool 中的所有任务都完成
pool.map,然后才整体处理所有结果,而是在每个任务完成后立即开始单独处理结果,与池中正在进行的工作。pool.imap_unordered将不按照我们添加任务的顺序返回结果,哪个任务完成得更快,第一个的结果将被返回。因此,您可以附上进度条,或加快结果的处理速度。例如下面,线程池中将向 Google 发送 10 个请求,对请求的响应将保存到文件中。脚本的输出显示保存文件(处理池操作的结果)与查询池的操作并行发生。
出去: