aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/examples/news_fetcher.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/examples/news_fetcher.v')
-rw-r--r--v_windows/v/examples/news_fetcher.v49
1 files changed, 49 insertions, 0 deletions
diff --git a/v_windows/v/examples/news_fetcher.v b/v_windows/v/examples/news_fetcher.v
new file mode 100644
index 0000000..e724fba
--- /dev/null
+++ b/v_windows/v/examples/news_fetcher.v
@@ -0,0 +1,49 @@
+// Copyright (c) 2019-2021 Alexander Medvednikov. All rights reserved.
+// Use of this source code is governed by an MIT license
+// that can be found in the LICENSE file.
+import net.http
+import json
+import sync.pool
+
+struct Story {
+ title string
+ url string
+}
+
+fn worker_fetch(p &pool.PoolProcessor, cursor int, worker_id int) voidptr {
+ id := p.get_item<int>(cursor)
+ resp := http.get('https://hacker-news.firebaseio.com/v0/item/${id}.json') or {
+ println('failed to fetch data from /v0/item/${id}.json')
+ return pool.no_result
+ }
+ story := json.decode(Story, resp.text) or {
+ println('failed to decode a story')
+ return pool.no_result
+ }
+ println('# $cursor) $story.title | $story.url')
+ return pool.no_result
+}
+
+// Fetches top HN stories in parallel, depending on how many cores you have
+fn main() {
+ resp := http.get('https://hacker-news.firebaseio.com/v0/topstories.json') or {
+ println('failed to fetch data from /v0/topstories.json')
+ return
+ }
+ mut ids := json.decode([]int, resp.text) or {
+ println('failed to decode topstories.json')
+ return
+ }
+ if ids.len > 10 {
+ ids = ids[0..10]
+ }
+ mut fetcher_pool := pool.new_pool_processor(
+ callback: worker_fetch
+ )
+ // NB: if you do not call set_max_jobs, the pool will try to use an optimal
+ // number of threads, one per each core in your system, which in most
+ // cases is what you want anyway... You can override the automatic choice
+ // by setting the VJOBS environment variable too.
+ // fetcher_pool.set_max_jobs( 4 )
+ fetcher_pool.work_on_items(ids)
+}