2009-10-20 17 views
12

Tôi có một ứng dụng java/scala hiện có bằng cách sử dụng một nhóm luồng chung. Tôi muốn bắt đầu sử dụng các diễn viên trong dự án nhưng muốn mọi thứ trong ứng dụng sử dụng cùng một hồ bơi.Cách chỉ định một nhóm chủ đề cho các diễn viên

Tôi biết tôi có thể đặt số lượng chủ đề tối đa mà các diễn viên sử dụng nhưng muốn chia sẻ nhóm chủ đề hơn. Điều này có cần thiết/hợp lý không và có thể chỉ định nhóm chủ đề của diễn viên không?

Nếu không thể/khuyến nghị, có quy tắc nào khi tích hợp các tác nhân trong ứng dụng đã sử dụng chuỗi không?

Cảm ơn.

Trả lời

7

Tôi tin rằng bạn có thể làm một cái gì đó như thế này:

trait MyActor extends Actor { 
    val pool = ... // git yer thread pool here 
    override def scheduler = new SchedulerAdapter { 
    def execute(block: => Unit) = 
     pool.execute(new Runnable { 
     def run() { block } 
     }) 
    } 
} 
+0

Tôi đoán bạn nên viết "val scheduler =" thay vì "def scheduler =", nếu không bạn sẽ có nhiều phiên bản của bộ lập lịch. –

+0

Ngoài ra, việc ghi đè lên executeFromActor (nhiệm vụ: Runnable) và thực thi (nhiệm vụ: Runnable) để thực hiện ngay lập tức bằng cách sử dụng pool: https://github.com/plokhotnyuk/actors/blob/master/src/test/scala/com /github/plokhotnyuk/actors/ScalaActorSpec.scala#L20 –

2

Nhưng nó khá dễ dàng để tái sử dụng hồ bơi thread được sử dụng bởi hệ thống con diễn viên. Thứ nhất, bạn có thể kiểm soát nó kích thước:

-Dactors.maxPoolSize=8 

Và bạn có thể gọi làm việc trên nó:

actors.Scheduler.execute(f); //f is => Unit 

Điều duy nhất nó thiếu là khả năng sắp xếp công việc. Đối với điều này tôi sử dụng một riêng biệt ScheduledExecutorService đó là đơn luồng và chạy công việc của mình trên các diễn viên bơi thread:

object MyScheduler { 
    private val scheduler = Executors.newSingleThreadedScheduledExecutorService 

    def schedule(f: => Unit, delay: (Long, TimeUnit)) : ScheduledFuture[_] = { 
     scheduler.schedule(new ScheduledRun(f), delay._1, delay._2) 
    } 

    private class ScheduledRun(f: => Unit) extends Runnable { 
    def run = actors.Scheduler.execute(f) 
    } 

} 

Sau đó, bạn có thể sử dụng để sắp xếp bất cứ điều gì:

MyScheduler.schedule(f, (60, SECONDS)) 
6

cho Scala 2.8 .1 it's:

scala -Dactors.corePoolSize=20 
Các vấn đề liên quan