2010-11-17 67 views
4

我正在寫幾個腳本去收集來自多個服務器的數據,這個數字會增長,並且我會嘗試將來驗證我的腳本,但是我有點卡住了。Perl腳本,使用分叉或線程?

所以開始我有一個腳本,在mysql數據庫中查找一個IP,然後連接到每個服務器獲取一些信息,然後再次將其放入數據庫。

我一直在想的是有限的時間來做到這一點,如果我有100臺服務器,它會花一點時間去每臺服務器獲取信息,然後將其推到一個數據庫。所以我想過在perl中使用fork或線程?

在我的情況下,哪個會是首選的選項?誰有任何例子?

謝謝!

編輯:好,所以需要更多的信息:我在Linux上運行,我認爲我可以讓主腳本收集數據庫信息,然後發送每個子進程/任務連接和收集信息,然後將信息推回​​到數據庫。

+0

Windows在線程模型中表現最好,unix比windows更能容忍進程創建。因此,在決定使用fork還是線程之前,您可能需要考慮OS。 fork()更容易編寫IMO,但更耗費資源。什麼操作系統? – 2010-11-17 12:01:48

+0

好吧,需要更多的信息:我在Linux上運行,我認爲我可以讓主腳本收集數據庫信息,然後發送每個子進程/任務連接和收集信息,然後將信息返回到分貝。 – ard 2010-11-17 13:11:13

+1

從Windows使用'fork'幾乎沒有錯。 – mob 2010-11-17 16:19:22

回答

3

分叉比線程更「資源安全」(思考數據庫模塊等),因此您可能想要走上這條路。

另一方面,根據您選擇的平臺,您可能希望避免在Perl中使用fork() -ing。從perlfork(1)引用:

Perl提供的是 對應於 同名Unix系統呼叫的叉()關鍵字。在fork()系統調用 可用的大多數類似Unix的 平臺上,Perl的fork()只需 就可以調用它。

在一些平臺,如Windows 其中叉()系統調用不是 可用,Perl可以在解釋 一級建立以 效仿叉()。雖然仿真 設計爲兼容的 可能是與真實叉()在 級Perl程序的,也有從事實 幹,所有的僞 子「進程」創建 某些重要的區別作爲操作系統, 與 的生活過程相同。

4

哪一個最好取決於您的需求;但對於什麼是值得這裏是我的經驗:

我最後一次使用Perl的線程,我發現這對我來說不是分叉實際上慢,更多的問題,因爲:

  • 線程複製所有數據,無論如何,作爲一個線程會但是全部預付
  • 線程並不總是清理退出時的複雜資源;導致緩慢的內存泄漏,這是不可接受的意圖成爲一個服務器
  • 幾個模塊沒有乾淨地處理線程,包括我使用的數據庫模塊,它非常困惑。

要注意的一個陷阱是「叉子」庫,它模擬「線程」,但使用實際分叉。我在這裏面臨的問題是它模仿的許多行爲正是我試圖擺脫的。我最終使用了一個經典的老派「叉子」,並使用套接字在需要的地方進行溝通。

問題與叉(庫,而不是叉命令):

  • 仍有疑問數據庫系統
  • 共享變量仍然非常有限
  • 推翻了「叉」命令,從而導致意想不到的行爲在軟件的其他地方