php 高并发sleep,如何在Future和Thread.sleep示例中使用spray.io实现高并发性?

implicit def executionContext = context.system.dispatchers.lookup("async-futures-dispatcher")

implicit val timeout = 10 seconds

val contestroute = "/contestroute" {

get {

respondWithMediaType(`application/json`) {

dynamic {

onSuccess(

Future {

val start = System.currentTimeMillis()

// np here should be dealt by 200 threads defined below, so why

// overall time takes so long? why doesn't it really utilize all

// threads I have given to it? how to update the code so it

// utilizes the 200 threads?

Thread.sleep(5000)

val status = s"timediff ${System.currentTimeMillis() - start}ms ${Thread.currentThread().getName}"

status

}) { time =>

complete(s"status: $time")

}

}

}

}

}

我的配置:

async-futures-dispatcher {

# Dispatcher is the name of the event-based dispatcher

type = Dispatcher

# What kind of ExecutionService to use

executor = "thread-pool-executor"

# Configuration for the thread pool

thread-pool-executor {

# minimum number of threads to cap factor-based core number to

core-pool-size-min = 200

# No of core threads ... ceil(available processors * factor)

core-pool-size-factor = 20.0

# maximum number of threads to cap factor-based number to

core-pool-size-max = 200

}

# Throughput defines the maximum number of messages to be

# processed per actor before the thread jumps to the next actor.

# Set to 1 for as fair as possible.

throughput = 100

}

但是当我运行Apache板凳这样的:

ab -n 200 -c 50 http://LAP:8080/contestroute

结果我得到的是:

Server Software: Apache-Coyote/1.1

Server Port:erred: 37500 bytes

HTML transferred: 10350 bytes

Requests per second: 4.31 [#/sec] (mean)

Time per request: 34776.278 [ms] (mean)

Time per request: 231.842 [ms] (mean, across all concurrent requests)

Transfer rate: 1.05 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 5 406 1021.3 7 3001

Processing: 30132 30466 390.8 30308 31231

Waiting: 30131 30464 391.8 30306 31231

Total: 30140 30872 998.9 30353 33228 8080

Document Path: /contestroute

Document Length: 69 bytes

Concurrency Level: 150

Time taken for tests: 34.776 seconds

Complete requests: 150

Failed requests: 0

Write errors: 0

Non-2xx responses: 150

Total transferred: 37500 bytes

HTML transferred: 10350 bytes

Requests per second: 4.31 [#/sec] (mean)

Time per request: 34776.278 [ms] (mean)

Time per request: 231.842 [ms] (mean, across all concurrent requests)

Transfer rate: 1.05 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 5 406 1021.3 7 3001

Processing: 30132 30466 390.8 30308 31231

Waiting: 30131 30464 391.8 30306 31231

Total: 30140 30872 998.9 30353 33228

我错过了一些大事吗?我需要改变以使我的spray和futures利用我给它的所有线程?

(加我在tomcat的servlet的3.0上运行)

2014-10-27

Jas

+2

我知道它是示例代码,但是为什么在作为“Future”执行的代码中“睡眠”。通过这样做,你基本上可以让这个未来的线程运行5秒,并且在5秒内完全不能分配给其他演员/将来。 –

2014-10-27 18:12:50

+0

我模拟一个长时间运行的操作,所以我可以看到我是否可以使用200个线程来运行这个长时间运行的操作。 –

2014-10-27 18:16:06

+1

你确定spray的底层actor系统是否还在拾取“async-futures-dispatcher”执行上下文。如果它无意中捡起它(因为它被定义为隐含的),那么这可能是问题的一部分。将阻塞代码从akka主调度器中分离出来执行上下文是一个好主意,就像你在这里做的那样,但是如果akka也使用这个执行上下文来运行代表这个路由的参与者,它将不起作用。 –

2014-10-27 18:25:32

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值