Python task execution in Go.
This project embeds Python via CGO and aims to make the Python GIL handling more straight forward.
Add the package to your go.mod
file:
require github.com/nickpoorman/pytasks master
Or, clone the repository:
git clone --branch master https://github.com/nickpoorman/pytasks.git $GOPATH/src/github.com/nickpoorman/pytasks
A complete example:
mkdir pytasks-app && cd pytasks-app
cat > go.mod <<-END
module my-dataframe-app
require (
github.com/nickpoorman/pytasks master
github.com/DataDog/go-python3 master
)
END
cat > main.go <<-END
package main
import (
"github.com/DataDog/go-python3"
"github.com/nickpoorman/pytasks"
)
func main() {
py := pytasks.GetPythonSingleton()
fooModule, err := py.ImportModule("foo")
if err != nil {
panic(err)
}
// Start task 1 - this will spawn a new goroutine
wg1, err := py.NewTask(func() {
odds := fooModule.GetAttrString("print_odds")
defer odds.DecRef()
odds.Call(python3.PyTuple_New(0), python3.PyDict_New())
})
if err != nil {
panic(err)
}
// Start task 2 - this will spawn a new goroutine
wg2, err := py.NewTask(func() {
even := fooModule.GetAttrString("print_even")
defer even.DecRef()
even.Call(python3.PyTuple_New(0), python3.PyDict_New())
})
if err != nil {
panic(err)
}
wg1.Wait()
wg2.Wait()
// At this point we know we won't need Python anymore in this
// program, we can restore the state and lock the GIL to perform
// the final operations before exiting.
py.Finalize()
}
END
go run main.go
See the task_example.go or tests and benchamrks for usage examples.
(c) 2019 Nick Poorman. Licensed under the Apache License, Version 2.0.