我正在开发一个网络后端,经常从网上抓取实时市场数据,并将数据放入MySQL数据库。
目前我将主线程推送任务放入Queue对象。然后,我有大约20个线程从该队列中读取,如果任务可用,则执行它。
不幸的是,我遇到了性能问题,经过大量研究后,我无法下定决心。
在我看来,我有3个选择: 我应该采用像Celery这样的分布式任务方法吗? 我应该切换到JPython或IronPython以避免GIL问题吗? 或者我应该简单地使用处理生成不同的进程而不是线程? 如果我选择后者,那么有多少流程是好的?什么是良好的多流程生产者/消费者设计?
谢谢!
答案 0 :(得分:1)
首先,对您的代码进行分析,以确定阻碍您的效果的因素。
如果每个线程经常写入MySQL数据库,问题可能是磁盘I / O,在这种情况下,您应该考虑使用内存数据库并定期将其写入磁盘。
如果您发现CPU性能是限制因素,请考虑使用multiprocessing
模块而不是threading
模块。使用multiprocessing.Queue
对象来推送您的任务。还要确保您的任务足够大,以使每个核心保持一段时间,这样通信的粒度不会影响性能。如果您目前正在使用threading
,那么切换到multiprocessing
将是目前最简单的方法。
答案 1 :(得分:1)
也许你应该使用event-driven方法,并使用面向事件的框架,如twisted(python)或node.js(javascript),例如这个框架使用UNIX域套接字,因此您的消费者在某个端口侦听,并且您的事件生成器对象将所有信息推送到使用者,因此您的消费者不必每次都检查队列中是否存在某些内容。