Python多个进程而不是线程?

时间:2012-05-24 17:56:05

标签: python multithreading multiprocess

我正在开发一个网络后端,经常从网上抓取实时市场数据,并将数据放入MySQL数据库。

目前我将主线程推送任务放入Queue对象。然后,我有大约20个线程从该队列中读取,如果任务可用,则执行它。

不幸的是,我遇到了性能问题,经过大量研究后,我无法下定决心。

在我看来,我有3个选择: 我应该采用像Celery这样的分布式任务方法吗? 我应该切换到JPython或IronPython以避免GIL问题吗? 或者我应该简单地使用处理生成不同的进程而不是线程? 如果我选择后者,那么有多少流程是好的?什么是良好的多流程生产者/消费者设计?

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,对您的代码进行分析,以确定阻碍您的效果的因素。

如果每个线程经常写入MySQL数据库,问题可能是磁盘I / O,在这种情况下,您应该考虑使用内存数据库并定期将其写入磁盘。

如果您发现CPU性能是限制因素,请考虑使用multiprocessing模块而不是threading模块。使用multiprocessing.Queue对象来推送您的任务。还要确保您的任务足够大,以使每个核心保持一段时间,这样通信的粒度不会影响性能。如果您目前正在使用threading,那么切换到multiprocessing将是目前最简单的方法。

答案 1 :(得分:1)

也许你应该使用event-driven方法,并使用面向事件的框架,如twisted(python)或node.js(javascript),例如这个框架使用UNIX域套接字,因此您的消费者在某个端口侦听,并且您的事件生成器对象将所有信息推送到使用者,因此您的消费者不必每次都检查队列中是否存在某些内容。