2012-05-14 61 views
5

我讀過很多JBoss Drools的文檔,但找不到一個明確的答案,如果所有的規則都是同時執行(當然它們同時被觸發)。更具體地說,對於1000條規則的單個輸入和規則集,可以在每個規則中執行「when」條件和「then」條件,按順序逐一執行,或者同時並行執行。JBoss Drools是否真的並行執行所有規則?

一方面rete算法意味着並行性,當然選擇節點摺疊。然而,節點優化後的評估順序?測試內存和連接節點看起來應該同時執行,但它們是?

此外,Drools文檔提到「順序模式」,並表示默認關閉此功能。那麼開啓了什麼,並行模式?並且有一個暗示線程的maxThreads選項。

另一方面,我被告知,代碼不利用線程,因此同時進行評估,但大部分依次執行。

有沒有人看過任何文檔證明這種情況?

謝謝!

回答

9

標準rete算法中並沒有表示並行性。衝突集是由匹配的規則產生的,然後議程會依次實施一個策略來解除這些規則。

多年來,在匹配或射擊階段期間,已經做了許多努力來並行rete的部分(s)。

並行觸發所有規則的一個大問題是確定性執行。

我們正在探索在Drools中併發和並行匹配的各種策略。我們也將探索併發規則解僱,但我們需要找到更強大的方式讓用戶指出可以並行解僱什麼,不能解決什麼問題;以便用戶在需要的地方獲得確定性執行。

+0

非常感謝,感謝您的回覆。我一直在規則講話和紅帽峯會上關注您的BRMS工作,並評估了流口水的採用情況。我發現流涎庫和技術非常易於理解,並且易於集成到定製的BRMS系統中。祝好運並行化,我想每個上帝都有一個獨立的議程組太過粗略的解決方案:) – user1393285

+0

請您詳細說明非確定性執行的後果。我會想象你仍然會得到正確的結果,或許缺點是執行不需要的規則。 –

+0

「我認爲一個獨立的議程組每個人都太粗略的解決方案:)」 如果您刪除組之間的所有共享,並且還確保在組之間的突變沒有重疊,這將是可能的。當一個組可以改變一個事實,另一個組可能會讀取的時候,你有表或者引擎級鎖。唯一的解決方法是使用樂觀風格MVCC鎖定。 –

1

看起來你已經解決了這個問題,但是如果你需要的話,我仍然可以提供更多的信息。在Drools的源代碼中使用了一個併發庫,顯示了github網頁鏈接, https://github.com/kiegroup/drools/blob/master/drools-core/src/main/java/org/drools/core/concurrent/ExecutorProviderImpl.java

幾點,

  1. 當然,線程工廠在操作執行中。如果您閱讀此Web鏈接中顯示的源代碼,則可以找到線程庫。

  2. 另外,你也可以詢問maxThread,Drools中使用的線程池的池大小如源代碼所示。 newExecutor = new ThreadPoolExecutor(Pool.SIZE, Pool.SIZE, 60L, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(), threadFactory);