Вы вызываете withPool
внутри вашего while
цикла, а также используете диапазон размера 1 в вашем eachParallel
, я думаю, что эти вещи в совокупности заставляют ваш код вести себя однопоточным образом.
Изменив это на что-то вроде этого:
import java.util.concurrent.CopyOnWriteArrayList
def futures = [] as CopyOnWriteArrayList
GParsExecutorsPool.withPool {
while(...) {
...
futures << {
callPolicy(Path2, Name2,split_body)
}.async().call()
}
}
// wait for all requests to complete
def results = futures*.get() // or futures.collect { it.get() } if this breaks
// results is now a list of return values from callPolicy
Я не тестировал и не запускал этот код, но он должен дать вам представление о том, как вы можете двигаться вперед.
<- редактировать после комментариев ->
Рабочий пример:
@Grab('org.codehaus.gpars:gpars:1.0.0')
import groovyx.gpars.*
import java.util.concurrent.*
import java.util.concurrent.atomic.*
import static groovyx.gpars.dataflow.Dataflow.task
random = new Random()
sequence = new AtomicInteger(-1)
def promises = [] as CopyOnWriteArrayList
GParsPool.withPool(25) { pool ->
10.times { index ->
promises << task {
callPolicy(index)
}
}
}
def results = promises*.get()
results.each { map ->
println map
}
def callPolicy(index) {
Thread.sleep(random.nextInt(100) % 100)
[index: index, sequence: sequence.incrementAndGet(), time: System.currentTimeMillis()]
}
, который производит следующий тип вывода:
~> groovy solution.groovy
[index:0, sequence:9, time:1558893973348]
[index:1, sequence:1, time:1558893973305]
[index:2, sequence:8, time:1558893973337]
[index:3, sequence:5, time:1558893973322]
[index:4, sequence:7, time:1558893973337]
[index:5, sequence:4, time:1558893973320]
[index:6, sequence:3, time:1558893973308]
[index:7, sequence:6, time:1558893973332]
[index:8, sequence:0, time:1558893973282]
[index:9, sequence:2, time:1558893973308]
~>
где мы видим, что результаты возвращаются, а также что вызовы выполняются многопоточным образом, поскольку значения sequence
и index
не являются последовательными.