2012-05-24 61 views
2

我正在開發一個web後端,它經常從網上抓取實時市場數據,並將數據放入MySQL數據庫。Python多進程而不是線程?

目前我有我的主線程推入任務到隊列對象。然後我有大約20個從該隊列中讀取的線程,並且如果有任務可用,則執行它。

不幸的是,我遇到了性能問題,並做了很多的研究,我不能讓我的心靈。

在我看來,我有3種選擇: 我應該採取分佈式任務的方法有像芹菜? 我應該切換到JPython還是IronPython以避免GIL問題? 或者我應該簡單地產生不同的進程而不是使用處理的線程? 如果我選擇後者,有多少流程是一個好的數量?什麼是好的多流程生產者/消費者設計?

謝謝!

+0

您是否確定了瓶頸? –

回答

1

也許你應該使用event-driven方法,並使用事件驅動的面向框架,如twisted(Python)或node.js(JavaScript的),例如這個框架利用UNIX域套接字,讓您的消費監聽在一些端口,並且您的事件生成器對象將所有信息推送給消費者,因此您的消費者不必每次都檢查隊列中是否有東西。

+0

謝謝 - 我以前肯定認爲扭曲,但我只是沒有看到這將如何工作 - 消費者究竟會接受什麼以及如何? – user1094786

1

首先,分析代碼,以確定哪些是瓶頸的性能。

如果每個線程都在頻繁寫入你的MySQL數據庫,該問題可能是磁盤I/O,在這種情況下,你應該考慮使用內存數據庫,並定期將其寫入磁盤。

如果您發現CPU性能是限制因素,請考慮使用multiprocessing模塊而不是threading模塊。使用multiprocessing.Queue對象推送您的任務。還要確保你的任務足夠大,以保持每個內核忙一段時間,以便通信的粒度不會影響性能。如果您目前使用threading,那麼切換到multiprocessing是目前最簡單的方法。

+0

說實話,我不確定如何檢查我的python進程如何利用其磁盤I/O等資源。我每分鐘總共有大約20,000-30,000個插入數據庫。這是否考慮了很多?平均行長度大約是60-70字節... – user1094786

+0

免責聲明:數據庫的東西是不是我的實力。也就是說,假設每分鐘30B插入70B,則每分鐘只寫入2MB,所以磁盤吞吐量可能不是問題。但是,如果每個插入是一個磁盤事務,則磁盤搜索延遲肯定會成爲瓶頸。有沒有什麼辦法可以將數據庫插入批處理?您應該剖析您的代碼,以查看哪些操作時間最長。看看這個答案的幫助:http://stackoverflow.com/questions/582336/how-can-you-profile-a-python-script –