2012-07-03 11 views
7

Czy istnieje sposób kontrolowania pul wątków, które obsługują funkcje wysyłane do agentów? Jak rozumiem, jeśli wysyłam, pod maską używam puli wątków bez ograniczeń. Chciałbym, powiedzmy, uruchomić niektóre funkcje w puli wątków i inne funkcje na innym. Powodem tego jest, że mam pewne funkcje, które wykonują IO, a które są również mniej ważne. Wrzuciłbym je do jakiejś ograniczonej puli wątków i nie przejmowałbym się, gdyby istniało nadmierne blokowanie i ułożyły się w stos, ponieważ są one, cóż, mniej ważne. Najważniejsze jest to, że nie chciałbym, aby ich zbędne blokowanie IO miało wpływ na niektóre ważniejsze funkcje, które działają na innej puli wątków.Zarządzanie pulami wątków agenta w Clojure

Odpieram pytanie od czegoś podobnego, co zrobiłem z pulami wątków w Akka i zastanawiam się, czy mogę osiągnąć to samo z Clojure.

+0

Sugerowałabym użycie Async IO do rozwiązania tego problemu zamiast zarządzania pulą wątków dla operacji IO – Ankur

Odpowiedz

12

Dla wersji Clojure do 1,4:

Nie można zastąpić wbudowany w środek wysyłać i pożegnanie baseny wątku. Są one zakodowane na stałe w Agent.java.

Pula wysyłana (używana do obliczeń) ma stały rozmiar = 2 + Runtime.getRuntime(). AvailableProcessors().

Pula wysyłek (używana również dla kontraktów terminowych) jest buforowaną pulą wątków i będzie rosnąć bez ograniczeń. Pozwala to dowolnej liczbie zadań w tle czekać na I/O. Buforowane wątki zostaną ponownie użyte i odrzucone, jeśli nie będą używane przez minutę.

Jeśli chcesz zarządzać pracę na własnym puli wątków, trzeba zanurzyć się java.util.concurrent lub użyć Clojure otoki lib.

Dla Clojure 1.5 (nadchodzącego):

Można dostarczyć własną ExecutorService użyciu (wysyłanie poprzez wykonawca bi), domyślne threadpools nie są podłączone na stałe już. Aby uzyskać szczegółowe informacje, patrz Agent.java in Clojure 1.5+.

+0

W jaki sposób można zdefiniować niestandardowe ThreadPools for Futures w wersji 1.5+? –

+0

Re niestandardowe ThreadPools for Futures - no. –

1

Amit Rathore (z Runa inc) opublikował bibliotekę (zwaną meduzą) do zarządzania pulami wątków. Wygląda na to, że prawie pasuje do tego, czego szukasz.

http://s-expressions.com/2010/06/08/medusa-0-1-a-supervised-thread-pool-for-clojure-futures-2/

+0

jest zintegrowana z agentami, czy jest oddzielna? innymi słowy - czy możesz go użyć do zastąpienia wbudowanych pul wątków? lub jest jakiś sposób tworzenia agentów z inną pulą wątków? nie widzę niczego, co by to tłumaczyło ... kiedy się o to martwiłem, zapytałem q - http://stackoverflow.com/questions/10969708/parallel-doseq-for-clojure - i nie sądzę, żeby odpowiedź dała płynny sposób na zastąpienie funkcjonalności systemu. –

+0

medusa jest alternatywną biblioteką do wykonywania zadań asynchronicznych, jest alternatywą dla wbudowanych agentów. –

2

Biblioteka Clojure Claypoole jest przeznaczona właśnie do tego. Pozwala definiować wątki i używać ich (i używać ich ponownie) do przyszłości, pmap i tak dalej.

+1

Popraw mnie, jeśli się mylę, ale nie sądzę, że Claypool daje ci kontrolę nad pulami wątków agentów, tylko pule wątków używane do _it's_ niestandardowych 'future',' pmap' i tak dalej. – metasoarous

+0

Och, tak, masz rację. –

Powiązane problemy