我可以同时运行两个多线程函数吗?
我刚接触多线程编程。在我的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 个回答
不,这样做不安全。如果 enqueue_tasks
和 process_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
同时运行了。