我可以同时运行两个多线程函数吗?

1 投票
1 回答
828 浏览
提问于 2025-04-27 23:47

我刚接触多线程编程。在我的Python脚本里,有两个函数。第一个函数叫做 enqueue_tasks,它会遍历一个很大的小物品列表,并对每个物品执行一个任务,这个任务是把物品添加到一个列表里(我们叫它 master_list)。这个部分我已经用多线程处理过了,使用了 futures。

executor = concurrent.futures.ThreadPoolExecutor(15) # Arbitrarily 15
futures = [executor.submit(enqueue_tasks, group) for group in grouper(key_list, 50)]
concurrent.futures.wait(futures)

第二个函数叫 process_master,它会遍历上面提到的 master_list,检查列表中每个物品的状态,然后进行一些操作。

我可以用同样的方法给 process_master 也加上多线程吗?而且,我能让它和 enqueue_tasks 同时运行吗?这样做有什么影响?因为 process_master 是依赖于 enqueue_tasks 生成的列表的,所以同时运行会不会有问题?有没有办法让我稍微延迟第二个函数的执行呢?(比如用 time.sleep?)

暂无标签

1 个回答

1

不,这样做不安全。如果 enqueue_tasksprocess_master 同时运行,你可能会在 enqueue_tasks 中往 master_list 里添加东西,而此时 process_master 正在遍历这个列表。边遍历边改变一个可迭代对象的大小会导致不确定的行为,这在 Python 中是要避免的。你应该使用 threading.Lock 来保护那些往 master_list 添加东西的代码,以及遍历 master_list 的代码,以确保它们不会同时运行。

更好的办法是使用 Queue.Queue(在 Python 3.x 中是 queue.Queue),这是一种线程安全的数据结构。在 enqueue_tasks 中往 Queue 里添加项目,在 process_master 中从 Queue 中获取项目。这样一来,process_master 就可以安全地和 enqueue_tasks 同时运行了。

撰写回答