python 线程/分叉?
我正在写一个Python脚本,需要同时完成三件事情。听说过GIL(全局解释器锁)后,我对使用线程的兴趣不大,所以想知道有什么好的方法来实现这个目标。
其中两件事情会非常活跃,它们需要处理很多工作,而第三件事情则是当用户询问时,通过一个套接字(socket)向用户报告另外两项工作的状态(就像一个小服务器)。
我的问题是,有什么好的方法可以实现这个?我不想写三个不同的脚本,而且因为GIL的原因,使用线程可能不会提高性能,反而可能让事情变得更糟。
Python有没有像C语言中的fork()那样的功能,可以从我的脚本中派生出两个进程来完成各自的工作,而主进程则负责向用户报告?我该如何让派生的进程与主进程进行通信呢?
补充说明:为了更具体一点,一个线程应该从IMAP服务器获取电子邮件并将其存储到数据库中,另一个线程应该从数据库获取需要发送的消息,然后发送它们,而主线程应该是一个小型HTTP服务器,只接受一个URL,并以JSON格式显示这两个线程的状态。那么,使用线程可以吗?工作会同时进行吗,还是因为GIL会导致性能问题?
2 个回答
GIL其实只有在你想要进行多进程处理的时候才需要关注,也就是把工作分散到多个核心或处理器上。如果你确实是这个意思,从你的描述来看,建议你使用多进程。
如果你只是想要同时做三件事情,但实际上是需要在后台等着事情发生,那么使用线程就可以了。线程本来就是为了这个目的而设计的。8-I)
我觉得你可以使用 multiprocessing 这个包,它的用法和线程包差不多,可以让你在单个CPU上更好地利用多个核心,从而提高性能。
如果你想看看使用multiprocessing和使用线程相比,性能提升了多少,可以查看 这个链接,里面有同一个程序在使用multiprocessing和线程时的平均时间对比。