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

时间:2014-10-16 16:54:50

标签: python multithreading multiprocessing

我对多线程非常陌生。我的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)?

1 个答案:

答案 0 :(得分:1)

不,这不安全。如果同时运行enqueue_tasksprocess_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以及getQueue中的process_master项。这样process_master可以安全地与enqueue_tasks同时运行。