gophernotes/examples/Worker-Pools.ipynb
2016-01-24 07:04:40 -06:00

217 lines
4.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Worker Pools"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this example well look at how to implement a worker pool using goroutines and channels.\n",
"\n",
"Comments from [Go by Example](https://gobyexample.com)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
":import \"fmt\""
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
":import \"time\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Worker Function"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Heres the worker, of which well run several concurrent instances. These workers will receive work on the jobs channel and send the corresponding results on results. Well sleep a second per job to simulate an expensive task."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"func worker(id int, jobs <-chan int, results chan<- int) {\n",
" for j := range jobs {\n",
" fmt.Println(\"worker\", id, \"processing job\", j)\n",
" time.Sleep(time.Second)\n",
" results <- j * 2\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Utilize Workers"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to use our pool of workers we need to send them work and collect their results. We make 2 channels for this."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(\u001b[32mchan int\u001b[0m)(\u001b[34m\u001b[1m0xc820061500\u001b[0m)\n"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jobs := make(chan int, 100)\n",
"results := make(chan int, 100)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, start up 3 workers, initially blocked because there are no jobs yet:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for w := 1; w <= 3; w++ {\n",
" go worker(w, jobs, results)\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Send 9 jobs and then close that channel to indicate thats all the work we have:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for j := 1; j <= 9; j++ {\n",
" jobs <- j\n",
"}\n",
"close(jobs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Collect Results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally we collect all the results of the work:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"worker 3 processing job 1\n",
"worker 1 processing job 2\n",
"worker 2 processing job 3\n",
"worker 3 processing job 5\n",
"worker 2 processing job 4\n",
"worker 1 processing job 6\n",
"worker 3 processing job 8\n",
"worker 1 processing job 7\n",
"worker 2 processing job 9\n"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"for a := 1; a <= 9; a++ {\n",
" <-results\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our running program shows the 9 jobs being executed by various workers. The program only takes about 3 seconds despite doing about 9 seconds of total work because there are 3 workers operating concurrently."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Golang",
"language": "go",
"name": "gophernotes"
},
"language_info": {
"name": "go"
}
},
"nbformat": 4,
"nbformat_minor": 0
}