I've introduced some future related procedures, in the context of concurrency, not the future in general as I'm not a prophet. The procedures will be available after the next release, version 0.9.8, which I'm planning to release very soon.
When I'm testing or writing scripts with future-map
, one of the future related procedures, I've noticed there's a thread blocking issue. The future-map
procedure creates a future object from a future object. At this moment, its implementation is pretty much naive, it gets the result of the giving future then apply the procedure passed to the future-map
, after that make a new future object. There're no difficult things, it works pretty fine as long as the number of future-map
calls is not that high. In other words, it's a toy quality...
The fundamental problem of the current implementation is that the new future depends on the result of the old future. This means the new future waits, blocks, the thread until the old future is done. If the underlying executor has only a couple of futures, this won't be a problem, just very useless to do it concurrently as all the future will be executed or return sequentially. Suppose I have an executor which has 3 threads in its thread pool. Then I call the future-map
say 4 times. The execution thread and order of the process would look like this:
As we can see, there are lots of red blocking parts. We can't, probably, help to have the blocking process but at least it should be able to schedule wisely, such as execute the future after the dependents are done or so.
At this moment, I don't have any solution how/what to do, so the problem most like stays on version 0.9.8...