v/vlib/sync/pool
Uwe Krüger 835b3b2b81
sync: simplify `WaitGroup` and `PoolProcessor` and use atomic counters (#8715)
2021-02-13 13:52:27 +01:00
..
README.md sync: move pool related code to `sync.pool`, cleanup, add a README.md 2021-02-11 10:55:23 +02:00
pool.v sync: simplify `WaitGroup` and `PoolProcessor` and use atomic counters (#8715) 2021-02-13 13:52:27 +01:00
pool_test.v sync: move pool related code to `sync.pool`, cleanup, add a README.md 2021-02-11 10:55:23 +02:00

README.md

The sync.pool module provides a convenient way to run identical tasks over an array of items in parallel, without worrying about thread synchronization, waitgroups, mutexes etc.., you just need to supply a callback function, that will be called once per each item in your input array.

After all the work is done in parallel by the worker threads in the pool, pool.work_on_items will return. You can then call pool.get_results() to retrieve a list of all the results, that the worker callbacks returned for each input item. Example:

import sync.pool

struct SResult {
	s string
}

fn sprocess(pp &pool.PoolProcessor, idx int, wid int) &SResult {
	item := pp.get_item<string>(idx)
	println('idx: $idx, wid: $wid, item: ' + item)
	return &SResult{item.reverse()}
}

fn main() {
	mut pp := pool.new_pool_processor(callback: sprocess)
	pp.work_on_items(['1abc', '2abc', '3abc', '4abc', '5abc', '6abc', '7abc'])
	// optionally, you can iterate over the results too:
	for x in pp.get_results<SResult>() {
		println('result: $x.s')
	}
}

See https://github.com/vlang/v/blob/master/vlib/sync/pool/pool_test.v for a more detailed usage example.