我对多线程非常陌生。我的python脚本中有2个函数。一个函数enqueue_tasks
遍历大型小项目列表,并对每个项目执行任务,包括将项目附加到列表中(让我们称之为master_list
)。我已经使用了未来的多线程。
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
)?
答案 0 :(得分:1)
不,这不安全。如果同时运行enqueue_tasks
和process_master
,您可能会在同一时间master_list
迭代enqueue_tasks
内向process_master
添加项目。迭代迭代时更改迭代的大小会导致Python中出现未定义的行为,应始终避免使用。您应该使用threading.Lock
来保护将项目添加到master_list
的代码,以及遍历master_list
的代码,以确保它们不会同时运行。
更好的是,使用Queue.Queue
(Python 3.x中的queue.Queue
)而不是list
,这是一个线程安全的数据结构。将项目添加到Queue
中的enqueue_tasks
以及get
中Queue
中的process_master
项。这样process_master
可以安全地与enqueue_tasks
同时运行。