2012-08-05 82 views
1

我知道這個標題聽起來像是十幾個其他問題的重複,很可能。但是,我已經閱讀了這些問題,並且搜索了一段時間,並沒有發現任何回答這些問題令我滿意的東西。如何在node.js中創建非IO操作同步與異步?

這可能是因爲沒有人正確回答它,在這種情況下,你應該投票給我。

這可能是因爲我很笨,不理解其他答案(更可能),在這種情況下,你應該投我一票。

語境:

我知道,在Node.js的IO操作檢測到,並在默認情況下異步運行。我的問題是關於仍然可能阻塞/運行很長時間的非IO操作。

說我有一個功能blockingfunction與一個for循環,做加法或whatnot(純粹的CPU週期,沒有IO),和它的很多。運行需要一分鐘或更長時間。

說我希望此功能在有人向我的服務器發送特定請求時運行。

問:

顯然,如果我明確地在我的代碼外水平調用這個循環中,一切都將阻塞,直到它完成。

我讀過的大多數建議,建議通過啓動所有我的其他處理器/服務器等第一,並通過process.nextTicksetTimeout(blockingfunction, 0)推遲函數的調用將其推出進入未來。

  • 但是不會blockingfunction1然後只是阻止下一個周圍的執行循環?我可能是錯的,但似乎這樣做會在不阻止應用程序的情況下啓動我的其他所有內容,但是當第一次有人提出請求導致調用blockingfunction時,只要花費完成,所有內容都會被阻止。

  • 是否將blockingfunction放入setTimeoutprocess.nextTick以某種方式使其與未來的操作共存而不會阻塞它們?

  • 如果不是,有沒有辦法使blockingfunction做到這一點,而不重寫它?

  • 其他人如何處理這個問題?我所看到的很多答案都是「只要相信你的CPU密集型產品要快,它們就會」,但這並不能令人滿意。

  • 缺席線程(在這裏我可以保證的blockingfunction執行將與任何其他人是怎麼回事的執行交織),要我重新寫CPU密集型/耗時循環使用process.nextTick執行固定的,保證快速的迭代次數?

回答

2

是的,你是對的。如果您延遲您的功能直到下一個勾號,它將會阻止該勾號而不是當前勾號。

不幸的是,這裏沒有什麼魔法可以解決這個問題。雖然有可能fire up that function in another process,但這可能不值得花費麻煩,具體取決於你在做什麼。

我建議重新編寫你的函數,讓它工作一段時間,然後繼續下一個勾號。節點滴答是非常有效的......如果需要的話,你可以稱它們爲每次體面大小循環的迭代,而不需要大量的開銷。當然,你必須在你的代碼中對它進行分析,以瞭解它的影響。

2

是的,即使運行process.nextTick,阻塞函數也會阻塞。

一些選項:

  1. 如果它確實需要一段時間,那麼或許應該紡出到一個隊列,你可以有一個專門的工作進程進行處理。 1)。 Node.js具有子進程特別用於分派具有內置通信通道的其他node.js文件。所以例如您可以創建一個(或幾個)線程來按順序處理這些請求,然後響應並觸發回調。請參閱:http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options

  2. 您可以將blockingFunction分解爲在循環中運行的塊。讓它使用process.nextTick調用每一次X迭代,讓其他事件被處理。