{ "info": { "author": "Kirill Smelkov", "author_email": "kirr@nexedi.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Programming Language :: Cython", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Interpreters", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "===================================================\n Pygolang - Go-like features for Python and Cython\n===================================================\n\nPackage `golang` provides Go-like features for Python:\n\n- `gpython` is Python interpreter with support for lightweight threads.\n- `go` spawns lightweight thread.\n- `chan` and `select` provide channels with Go semantic.\n- `func` allows to define methods separate from class.\n- `defer` allows to schedule a cleanup from the main control flow.\n- `gimport` allows to import python modules by full path in a Go workspace.\n\nPackage `golang.pyx` provides__ similar features for Cython/nogil.\n\n__ `Cython/nogil API`_\n\nAdditional packages and utilities are also provided__ to close other gaps\nbetween Python/Cython and Go environments.\n\n__ `Additional packages and utilities`_\n\n\n\n.. contents::\n :depth: 1\n\n\nGPython\n-------\n\nCommand `gpython` provides Python interpreter that supports lightweight threads\nvia tight integration with gevent__. The standard library of GPython is API\ncompatible with Python standard library, but inplace of OS threads lightweight\ncoroutines are provided, and IO is internally organized via\nlibuv__/libev__-based IO scheduler. Consequently programs can spawn lots of\ncoroutines cheaply, and modules like `time`, `socket`, `ssl`, `subprocess` etc -\nall could be used from all coroutines simultaneously, and in the same blocking way\nas if every coroutine was a full OS thread. This gives ability to scale programs\nwithout changing concurrency model and existing code.\n\n__ http://www.gevent.org/\n__ http://libuv.org/\n__ http://software.schmorp.de/pkg/libev.html\n\n\nAdditionally GPython sets UTF-8 to be default encoding always, and puts `go`,\n`chan`, `select` etc into builtin namespace.\n\n.. note::\n\n GPython is optional and the rest of Pygolang can be used from under standard Python too.\n However without gevent integration `go` spawns full - not lightweight - OS thread.\n\n\nGoroutines and channels\n-----------------------\n\n`go` spawns a coroutine, or thread if gevent was not activated. It is possible to\nexchange data in between either threads or coroutines via channels. `chan`\ncreates a new channel with Go semantic - either synchronous or buffered. Use\n`chan.recv`, `chan.send` and `chan.close` for communication. `nilchan`\nstands for the nil channel. `select` can be used to multiplex on several\nchannels. For example::\n\n ch1 = chan() # synchronous channel\n ch2 = chan(3) # channel with buffer of size 3\n\n def _():\n ch1.send('a')\n ch2.send('b')\n go(_)\n\n ch1.recv() # will give 'a'\n ch2.recv_() # will give ('b', True)\n\n ch2 = nilchan # rebind ch2 to nil channel\n _, _rx = select(\n ch1.recv, # 0\n ch1.recv_, # 1\n (ch1.send, obj), # 2\n ch2.recv, # 3\n default, # 4\n )\n if _ == 0:\n # _rx is what was received from ch1\n ...\n if _ == 1:\n # _rx is (rx, ok) of what was received from ch1\n ...\n if _ == 2:\n # we know obj was sent to ch1\n ...\n if _ == 3:\n # this case will be never selected because\n # send/recv on nil channel block forever.\n ...\n if _ == 4:\n # default case\n ...\n\nMethods\n-------\n\n`func` decorator allows to define methods separate from class.\n\nFor example::\n\n @func(MyClass)\n def my_method(self, ...):\n ...\n\nwill define `MyClass.my_method()`.\n\n`func` can be also used on just functions, for example::\n\n @func\n def my_function(...):\n ...\n\n\nDefer / recover / panic\n-----------------------\n\n`defer` allows to schedule a cleanup to be executed when current function\nreturns. It is similar to `try`/`finally` but does not force the cleanup part\nto be far away in the end. For example::\n\n wc = wcfs.join(zurl) \u2502 wc = wcfs.join(zurl)\n defer(wc.close) \u2502 try:\n \u2502 ...\n ... \u2502 ...\n ... \u2502 ...\n ... \u2502 finally:\n \u2502 wc.close()\n\nFor completeness there is `recover` and `panic` that allow to program with\nGo-style error handling, for example::\n\n def _():\n r = recover()\n if r is not None:\n print(\"recovered. error was: %s\" % (r,))\n defer(_)\n\n ...\n\n panic(\"aaa\")\n\nBut `recover` and `panic` are probably of less utility since they can be\npractically natively modelled with `try`/`except`.\n\nIf `defer` is used, the function that uses it must be wrapped with `@func`\ndecorator.\n\n\nImport\n------\n\n`gimport` provides way to import python modules by full path in a Go workspace.\n\nFor example\n\n::\n\n lonet = gimport('lab.nexedi.com/kirr/go123/xnet/lonet')\n\nwill import either\n\n- `lab.nexedi.com/kirr/go123/xnet/lonet.py`, or\n- `lab.nexedi.com/kirr/go123/xnet/lonet/__init__.py`\n\nlocated in `src/` under `$GOPATH`.\n\n\nCython/nogil API\n----------------\n\nCython package `golang` provides *nogil* API with goroutines, channels and\nother features that mirror corresponding Python package. Cython API is not only\nfaster compared to Python version, but also, due to *nogil* property, allows to\nbuild concurrent systems without limitations imposed by Python's GIL. All that\nwhile still programming in Python-like language. Brief description of\nCython/nogil API follows:\n\n`go` spawns new task - a coroutine, or thread, depending on activated runtime.\n`chan[T]` represents a channel with Go semantic and elements of type `T`.\nUse `makechan[T]` to create new channel, and `chan[T].recv`, `chan[T].send`,\n`chan[T].close` for communication. `nil` stands for the nil channel. `select`\ncan be used to multiplex on several channels. For example::\n\n cdef nogil:\n struct Point:\n int x\n int y\n\n void worker(chan[int] chi, chan[Point] chp):\n chi.send(1)\n\n cdef Point p\n p.x = 3\n p.y = 4\n chp.send(p)\n\n void myfunc():\n cdef chan[int] chi = makechan[int]() # synchronous channel of integers\n cdef chan[Point] chp = makechan[Point](3) # channel with buffer of size 3 and Point elements\n\n go(worker, chi, chp)\n\n i = chi.recv() # will give 1\n p = chp.recv() # will give Point(3,4)\n\n chp = nil # rebind chp to nil channel\n cdef cbool ok\n cdef int j = 33\n _ = select([\n chi.recvs(&i) # 0\n chi.recvs(&i, &ok), # 1\n chi.sends(&j), # 2\n chp.recvs(&p), # 3\n default, # 4\n ])\n if _ == 0:\n # i is what was received from chi\n ...\n if _ == 1:\n # (i, ok) is what was received from chi\n ...\n if _ == 2:\n # we know j was sent to chi\n ...\n if _ == 3:\n # this case will be never selected because\n # send/recv on nil channel block forever.\n ...\n if _ == 4:\n # default case\n ...\n\n`panic` stops normal execution of current goroutine by throwing a C-level\nexception. On Python/C boundaries C-level exceptions have to be converted to\nPython-level exceptions with `topyexc`. For example::\n\n cdef void _do_something() nogil:\n ...\n panic(\"bug\") # hit a bug\n\n # do_something is called by Python code - it is thus on Python/C boundary\n cdef void do_something() nogil except +topyexc:\n _do_something()\n\n def pydo_something():\n with nogil:\n do_something()\n\n\nSee |libgolang.h|_ and |golang.pxd|_ for details of the API.\nSee also |testprog/golang_pyx_user/|_ for demo project that uses Pygolang in\nCython/nogil mode.\n\n.. |libgolang.h| replace:: `libgolang.h`\n.. _libgolang.h: https://lab.nexedi.com/kirr/pygolang/tree/master/golang/libgolang.h\n\n.. |golang.pxd| replace:: `golang.pxd`\n.. _golang.pxd: https://lab.nexedi.com/kirr/pygolang/tree/master/golang/_golang.pxd\n\n.. |testprog/golang_pyx_user/| replace:: `testprog/golang_pyx_user/`\n.. _testprog/golang_pyx_user/: https://lab.nexedi.com/kirr/pygolang/tree/master/golang/pyx/testprog/golang_pyx_user\n\n--------\n\nAdditional packages and utilities\n---------------------------------\n\nThe following additional packages and utilities are also provided to close gaps\nbetween Python/Cython and Go environments:\n\n.. contents::\n :local:\n\nConcurrency\n~~~~~~~~~~~\n\nIn addition to `go` and channels, the following packages are provided to help\nhandle concurrency in structured ways:\n\n- `golang.context` provides contexts to propagate deadlines, cancellation and\n task-scoped values among spawned goroutines [*]_.\n\n- `golang.sync` provides `sync.WorkGroup` to spawn group of goroutines working\n on a common task. It also provides low-level primitives - for example\n `sync.Once` and `sync.WaitGroup` - that are sometimes useful too.\n\n- `golang.time` provides timers integrated with channels.\n\n.. [*] See `Go Concurrency Patterns: Context`__ for overview.\n\n__ https://blog.golang.org/context\n\n\nString conversion\n~~~~~~~~~~~~~~~~~\n\n`qq` (import from `golang.gcompat`) provides `%q` functionality that quotes as\nGo would do. For example the following code will print name quoted in `\"`\nwithout escaping printable UTF-8 characters::\n\n print('hello %s' % qq(name))\n\n`qq` accepts both `str` and `bytes` (`unicode` and `str` on Python2)\nand also any other type that can be converted to `str`.\n\nPackage `golang.strconv` provides direct access to conversion routines, for\nexample `strconv.quote` and `strconv.unquote`.\n\n\nBenchmarking and testing\n~~~~~~~~~~~~~~~~~~~~~~~~\n\n`py.bench` allows to benchmark python code similarly to `go test -bench` and `py.test`.\nFor example, running `py.bench` on the following code::\n\n def bench_add(b):\n x, y = 1, 2\n for i in xrange(b.N):\n x + y\n\ngives something like::\n\n $ py.bench --count=3 x.py\n ...\n pymod: bench_add.py\n Benchmarkadd 50000000 0.020 \u00b5s/op\n Benchmarkadd 50000000 0.020 \u00b5s/op\n Benchmarkadd 50000000 0.020 \u00b5s/op\n\nPackage `golang.testing` provides corresponding runtime bits, e.g. `testing.B`.\n\n`py.bench` produces output in `Go benchmark format`__, and so benchmark results\ncan be analyzed and compared with standard Go tools, for example with\n`benchstat`__.\nAdditionally package `golang.x.perf.benchlib` can be used to load and process\nsuch benchmarking data in Python.\n\n__ https://github.com/golang/proposal/blob/master/design/14313-benchmark-format.md\n__ https://godoc.org/golang.org/x/perf/cmd/benchstat\n\n----\n\nPygolang change history\n-----------------------\n\n0.0.4 (2019-09-17)\n~~~~~~~~~~~~~~~~~~\n\n- Add ThreadSanitizer, AddressSanitizer and Python debug builds to testing coverage (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/4dc1a7f0\n\n- Fix race bugs in `close`, `recv` and `select` (`commit 1`__, 2__, 3__, 4__, 5__, 6__).\n A 25-years old race condition in Python was also discovered while doing\n quality assurance on concurrency (`commit 7`__, `Python bug`__, `PyPy bug`__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/78e38690\n __ https://lab.nexedi.com/kirr/pygolang/commit/44737253\n __ https://lab.nexedi.com/kirr/pygolang/commit/c92a4830\n __ https://lab.nexedi.com/kirr/pygolang/commit/dcf4ebd1\n __ https://lab.nexedi.com/kirr/pygolang/commit/65c43848\n __ https://lab.nexedi.com/kirr/pygolang/commit/5aa1e899\n __ https://lab.nexedi.com/kirr/pygolang/commit/5142460d\n __ https://bugs.python.org/issue38106\n __ https://bitbucket.org/pypy/pypy/issues/3072\n\n- If C-level panic causes termination, its argument is now printed (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/f2b77c94\n\n\n0.0.3 (2019-08-29)\n~~~~~~~~~~~~~~~~~~\n\n- Provide Cython/nogil API with goroutines and channels. Cython API is not only\n faster compared to Python version, but also, due to *nogil* property, allows to\n build concurrent systems without limitations imposed by Python's GIL.\n This work was motivated by wendelin.core__ v2, which, due to its design,\n would deadlock if it tries to take the GIL in its pinner thread.\n Implementation of Python-level goroutines and channels becomes tiny wrapper\n around Cython/nogil API. This brings in ~5x speedup to Python-level `golang`\n package along the way (`commit 1`__, 2__, 3__, 4__, 5__, 6__, 7__, 8__, 9__,\n 10__, 11__, 12__, 13__, 14__, 15__, 16__, 17__, 18__, 19__, 20__, 21__, 22__,\n 23__, 24__, 25__, 26__, 27__).\n\n __ https://pypi.org/project/wendelin.core\n __ https://lab.nexedi.com/kirr/pygolang/commit/d98e42e3\n __ https://lab.nexedi.com/kirr/pygolang/commit/352628b5\n __ https://lab.nexedi.com/kirr/pygolang/commit/fa667412\n __ https://lab.nexedi.com/kirr/pygolang/commit/f812faa2\n __ https://lab.nexedi.com/kirr/pygolang/commit/88eb8fe0\n __ https://lab.nexedi.com/kirr/pygolang/commit/62bdb806\n __ https://lab.nexedi.com/kirr/pygolang/commit/8fa3c15b\n __ https://lab.nexedi.com/kirr/pygolang/commit/ad00be70\n __ https://lab.nexedi.com/kirr/pygolang/commit/ce8152a2\n __ https://lab.nexedi.com/kirr/pygolang/commit/7ae8c4f3\n __ https://lab.nexedi.com/kirr/pygolang/commit/f971a2a8\n __ https://lab.nexedi.com/kirr/pygolang/commit/83259a1b\n __ https://lab.nexedi.com/kirr/pygolang/commit/311df9f1\n __ https://lab.nexedi.com/kirr/pygolang/commit/7e55394d\n __ https://lab.nexedi.com/kirr/pygolang/commit/790189e3\n __ https://lab.nexedi.com/kirr/pygolang/commit/a508be9a\n __ https://lab.nexedi.com/kirr/pygolang/commit/a0714b8e\n __ https://lab.nexedi.com/kirr/pygolang/commit/1bcb8297\n __ https://lab.nexedi.com/kirr/pygolang/commit/ef076d3a\n __ https://lab.nexedi.com/kirr/pygolang/commit/4166dc65\n __ https://lab.nexedi.com/kirr/pygolang/commit/b9333e00\n __ https://lab.nexedi.com/kirr/pygolang/commit/d5e74947\n __ https://lab.nexedi.com/kirr/pygolang/commit/2fc71566\n __ https://lab.nexedi.com/kirr/pygolang/commit/e4dddf15\n __ https://lab.nexedi.com/kirr/pygolang/commit/69db91bf\n __ https://lab.nexedi.com/kirr/pygolang/commit/9efb6575\n __ https://lab.nexedi.com/kirr/pygolang/commit/3b241983\n\n\n- Provide way to install Pygolang with extra requirements in the form of\n `pygolang[]`. For example `pygolang[x.perf.benchlib]` additionally\n selects NumPy, `pygolang[pyx.build]` - everything needed by build system, and\n `pygolang[all]` selects everything (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/89a1061a\n\n- Improve tests to exercise the implementation more thoroughly in many\n places (`commit 1`__, 2__, 3__, 4__, 5__, 6__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/773d8fb2\n __ https://lab.nexedi.com/kirr/pygolang/commit/3e5b5f01\n __ https://lab.nexedi.com/kirr/pygolang/commit/7f2362dd\n __ https://lab.nexedi.com/kirr/pygolang/commit/c5810987\n __ https://lab.nexedi.com/kirr/pygolang/commit/cb5bfdd2\n __ https://lab.nexedi.com/kirr/pygolang/commit/02f6991f\n\n- Fix race bugs in buffered channel send and receive (`commit 1`__, 2__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/eb8a1fef\n __ https://lab.nexedi.com/kirr/pygolang/commit/c6bb9eb3\n\n- Fix deadlock in `sync.WorkGroup` tests (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/b8b042c5\n\n- Fix `@func(cls) def name` not to override `name` in calling context (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/924a808c\n\n- Fix `sync.WorkGroup` to propagate all exception types, not only those derived\n from `Exception` (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/79aab7df\n\n- Replace `threading.Event` with `chan` in `sync.WorkGroup` implementation.\n This removes reliance on outside semaphore+waitlist code and speeds up\n `sync.WorkGroup` along the way (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/78d85cdc\n\n- Speedup `sync.WorkGroup` by not using `@func` at runtime (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/94c6160b\n\n- Add benchmarks for `chan`, `select`, `@func` and `defer` (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/3c55ca59\n\n.. readme_renderer/pypi don't support `.. class:: align-center`\n.. |_| unicode:: 0xA0 .. nbsp\n\n|_| |_| |_| |_| |_| |_| |_| |_| *This release is dedicated to the memory of* |\u0412\u0435\u0440\u0430 \u041f\u0430\u0432\u043b\u043e\u0432\u043d\u0430 \u0421\u0443\u043f\u0440\u0443\u043d|_.\n\n.. |\u0412\u0435\u0440\u0430 \u041f\u0430\u0432\u043b\u043e\u0432\u043d\u0430 \u0421\u0443\u043f\u0440\u0443\u043d| replace:: *\u0412\u0435\u0440\u0430 \u041f\u0430\u0432\u043b\u043e\u0432\u043d\u0430 \u0421\u0443\u043f\u0440\u0443\u043d*\n.. _\u0412\u0435\u0440\u0430 \u041f\u0430\u0432\u043b\u043e\u0432\u043d\u0430 \u0421\u0443\u043f\u0440\u0443\u043d: https://navytux.spb.ru/memory/%D0%A2%D1%91%D1%82%D1%8F%20%D0%92%D0%B5%D1%80%D0%B0.pdf#page=3\n\n\n0.0.2 (2019-05-16)\n~~~~~~~~~~~~~~~~~~\n\n- Add `time` package with `time.Timer` and `time.Ticker` (`commit 1`__, 2__, 3__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/81dfefa0\n __ https://lab.nexedi.com/kirr/pygolang/commit/6e3b3ff4\n __ https://lab.nexedi.com/kirr/pygolang/commit/9c260fde\n\n- Add support for deadlines and timeouts to `context` package (`commit 1`__, 2__, 3__, 4__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/58ba1765\n __ https://lab.nexedi.com/kirr/pygolang/commit/e5687f2f\n __ https://lab.nexedi.com/kirr/pygolang/commit/27f91b78\n __ https://lab.nexedi.com/kirr/pygolang/commit/b2450310\n\n0.0.1 (2019-05-09)\n~~~~~~~~~~~~~~~~~~\n\n- Add support for nil channels (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/2aad64bb\n\n- Add `context` package to propagate cancellation and task-scoped values among\n spawned goroutines (commit__, `overview`__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/e9567c7b\n __ https://blog.golang.org/context\n\n- Add `sync` package with `sync.WorkGroup` to spawn group of goroutines working\n on a common task (`commit 1`__, 2__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/e6bea2cf\n __ https://lab.nexedi.com/kirr/pygolang/commit/9ee7ba91\n\n- Remove deprecated `@method` (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/262f8986\n\n0.0.0.dev8 (2019-03-24)\n~~~~~~~~~~~~~~~~~~~~~~~\n\n- Fix `gpython` to properly initialize `sys.path` (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/6b4990f6\n\n- Fix channel tests to pass irregardless of surround OS load (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/731f39e3\n\n- Deprecate `@method(cls)` in favour of `@func(cls)` (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/942ee900\n\n- Support both `PyPy2` and `PyPy3` (`commit 1`__, 2__, 3__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/da68a8ae\n __ https://lab.nexedi.com/kirr/pygolang/commit/e847c550\n __ https://lab.nexedi.com/kirr/pygolang/commit/704d99f0\n\n0.0.0.dev7 (2019-01-16)\n~~~~~~~~~~~~~~~~~~~~~~~\n\n- Provide `gpython` interpreter, that sets UTF-8 as default encoding, integrates\n gevent and puts `go`, `chan`, `select` etc into builtin namespace (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/32a21d5b\n\n0.0.0.dev6 (2018-12-13)\n~~~~~~~~~~~~~~~~~~~~~~~\n\n- Add `strconv` package with `quote` and `unquote` (`commit 1`__, 2__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/f09701b0\n __ https://lab.nexedi.com/kirr/pygolang/commit/ed6b7895\n\n- Support `PyPy` as well (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/c859940b\n\n0.0.0.dev5 (2018-10-30)\n~~~~~~~~~~~~~~~~~~~~~~~\n\n- Fix `select` bug that was causing several cases to be potentially executed\n at the same time (`commit 1`__, 2__, 3__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/f0b592b4\n __ https://lab.nexedi.com/kirr/pygolang/commit/b51b8d5d\n __ https://lab.nexedi.com/kirr/pygolang/commit/2fc6797c\n\n- Add `defer` and `recover` (commit__).\n The implementation is partly inspired by work of Denis Kolodin (1__, 2__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/5146eb0b\n __ https://habr.com/post/191786\n __ https://stackoverflow.com/a/43028386/9456786\n\n- Fix `@method` on Python3 (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/ab69e0fa\n\n- A leaked goroutine no longer prevents whole program to exit (`commit 1`__, 2__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/69cef96e\n __ https://lab.nexedi.com/kirr/pygolang/commit/ec929991\n\n\n0.0.0.dev4 (2018-07-04)\n~~~~~~~~~~~~~~~~~~~~~~~\n\n- Add `py.bench` program and `golang.testing` package with corresponding bits (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/9bf03d9c\n\n0.0.0.dev3 (2018-07-02)\n~~~~~~~~~~~~~~~~~~~~~~~\n\n- Support both Python2 and Python3; `qq` now does not escape printable UTF-8\n characters. (`commit 1`__, 2__, 3__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/02dddb97\n __ https://lab.nexedi.com/kirr/pygolang/commit/e01e5c2f\n __ https://lab.nexedi.com/kirr/pygolang/commit/622ccd82\n\n- `golang/x/perf/benchlib:` New module to load & work with data in Go benchmark\n format (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/812e7ed7\n\n\n0.0.0.dev2 (2018-06-20)\n~~~~~~~~~~~~~~~~~~~~~~~\n\n- Turn into full pygolang: `go`, `chan`, `select`, `method` and `gcompat.qq`\n are provided in addition to `gimport` (commit__). The implementation is\n not very fast, but should be working correctly including `select` - `select`\n sends for synchronous channels.\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/afa46cf5\n\n\n0.0.0.dev1 (2018-05-21)\n~~~~~~~~~~~~~~~~~~~~~~~\n\n- Initial release; `gimport` functionality only (commit__).\n\n __ https://lab.nexedi.com/kirr/pygolang/commit/9c61f254", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://lab.nexedi.com/kirr/pygolang", "keywords": "golang go channel goroutine concurrency GOPATH python import gpython gevent cython nogil GIL", "license": "GPLv3+ with wide exception for Open-Source", "maintainer": "", "maintainer_email": "", "name": "pygolang", "package_url": "https://pypi.org/project/pygolang/", "platform": "", "project_url": "https://pypi.org/project/pygolang/", "project_urls": { "Bug Tracker": "https://lab.nexedi.com/kirr/pygolang/issues", "Documentation": "https://pypi.org/project/pygolang", "Homepage": "https://lab.nexedi.com/kirr/pygolang", "Source Code": "https://lab.nexedi.com/kirr/pygolang" }, "release_url": "https://pypi.org/project/pygolang/0.0.4/", "requires_dist": null, "requires_python": "", "summary": "Go-like features for Python and Cython", "version": "0.0.4" }, "last_serial": 5839878, "releases": { "0.0.0.dev2": [ { "comment_text": "", "digests": { "md5": "0afb17d21a5e1912dff24ea750f2c503", "sha256": "f39076c689e12de461f3590fdeff5ffcaaac76e32cd4955e1dfa6063a4d4e545" }, "downloads": -1, "filename": "pygolang-0.0.0.dev2.tar.gz", "has_sig": true, "md5_digest": "0afb17d21a5e1912dff24ea750f2c503", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9640, "upload_time": "2018-06-20T12:34:23", "url": "https://files.pythonhosted.org/packages/47/9a/25631d52045d4ad4c38effb6d5cc002e47a72ff4f419cf12627708882562/pygolang-0.0.0.dev2.tar.gz" } ], "0.0.0.dev3": [ { "comment_text": "", "digests": { "md5": "11820aadbcc1f680d27b7788c5a4f000", "sha256": "559056e570d69b9052c5df69d3c7cda42b221088f4ea105a1a400d4e2c877116" }, "downloads": -1, "filename": "pygolang-0.0.0.dev3.tar.gz", "has_sig": true, "md5_digest": "11820aadbcc1f680d27b7788c5a4f000", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16449, "upload_time": "2018-07-02T16:53:16", "url": "https://files.pythonhosted.org/packages/1a/e1/5fa37364be29432e7a8da9e889d6c5de4d00dc51326633384e95e0e90bfd/pygolang-0.0.0.dev3.tar.gz" } ], "0.0.0.dev4": [ { "comment_text": "", "digests": { "md5": "14e5c81e07f2ed1866712db029c7bb37", "sha256": "b9e0853525c76ec9ed5755e6f96b3edfa36cb3186aad3d4e7fe3b73af5739969" }, "downloads": -1, "filename": "pygolang-0.0.0.dev4.tar.gz", "has_sig": true, "md5_digest": "14e5c81e07f2ed1866712db029c7bb37", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20625, "upload_time": "2018-07-04T13:30:01", "url": "https://files.pythonhosted.org/packages/59/a2/cb450972961b01feb071902932628e40767e4512b617f39f939fe2025eb0/pygolang-0.0.0.dev4.tar.gz" } ], "0.0.0.dev5": [ { "comment_text": "", "digests": { "md5": "766ced114dab1898f17930f2258b4d94", "sha256": "2493346e2c8e39195816220a4327a215cda3b19a1f32e06398737eff616258ce" }, "downloads": -1, "filename": "pygolang-0.0.0.dev5.tar.gz", "has_sig": true, "md5_digest": "766ced114dab1898f17930f2258b4d94", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24841, "upload_time": "2018-10-30T16:58:32", "url": "https://files.pythonhosted.org/packages/a9/45/a87fc203e239d8cbb88d62b95c9cad620a78fb2797b0a5fc10abdd8f6829/pygolang-0.0.0.dev5.tar.gz" } ], "0.0.0.dev6": [ { "comment_text": "", "digests": { "md5": "561edf50628ad355b3b75ae50d7472f3", "sha256": "014b952191aa60399ab2fb1a8b6688a2352b1ea5df6a118d829f4f3f08439f05" }, "downloads": -1, "filename": "pygolang-0.0.0.dev6.tar.gz", "has_sig": true, "md5_digest": "561edf50628ad355b3b75ae50d7472f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27383, "upload_time": "2018-12-13T12:51:26", "url": "https://files.pythonhosted.org/packages/1e/18/9089989d24b8398b00daa4151952a4ae426b20bf3161e4aa9865a733c88c/pygolang-0.0.0.dev6.tar.gz" } ], "0.0.0.dev7": [ { "comment_text": "", "digests": { "md5": "d6eeeeb0405a7ffa3e92c0e77b2f79c3", "sha256": "7d84778131f6fa240c13d3b4165f2681eebe69b509853e0ca4437e8807bbb5eb" }, "downloads": -1, "filename": "pygolang-0.0.0.dev7.tar.gz", "has_sig": true, "md5_digest": "d6eeeeb0405a7ffa3e92c0e77b2f79c3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45371, "upload_time": "2019-01-16T14:13:52", "url": "https://files.pythonhosted.org/packages/9d/72/35dcf273aa5f6c76a14445fb8567b14a491dd73b49074ea4bc558600367a/pygolang-0.0.0.dev7.tar.gz" } ], "0.0.0.dev8": [ { "comment_text": "", "digests": { "md5": "f39828de90ea309213f30b745d487667", "sha256": "fbbfb8c41e44662345f97a36bae7a54938ab4c12c685f9c4c4e8d1a6a1864fa6" }, "downloads": -1, "filename": "pygolang-0.0.0.dev8.tar.gz", "has_sig": true, "md5_digest": "f39828de90ea309213f30b745d487667", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47068, "upload_time": "2019-03-24T10:40:04", "url": "https://files.pythonhosted.org/packages/4e/4b/4c935999e544f23f2e45f7e68892a8f7ca73e1c3de4935c80c8b0dc68a63/pygolang-0.0.0.dev8.tar.gz" } ], "0.0.1": [ { "comment_text": "", "digests": { "md5": "93820df1da38066d819855a14118c2db", "sha256": "228d9ac4a46a788652380309fd33cb034ddf6cebd8e0b9206cb6b6c44cc66594" }, "downloads": -1, "filename": "pygolang-0.0.1.tar.gz", "has_sig": true, "md5_digest": "93820df1da38066d819855a14118c2db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57158, "upload_time": "2019-05-09T20:14:13", "url": "https://files.pythonhosted.org/packages/79/cf/162fc7b36b38a8f37cc2c4dcd6f93c7a2baa89978e2fcf6a33df1a824355/pygolang-0.0.1.tar.gz" } ], "0.0.1.post1": [ { "comment_text": "", "digests": { "md5": "b61271c3acf43c6d5385d377d8dd5b9d", "sha256": "a1ac826439d462518ac1e907158ef00a82af2f972940711337b45813dabf64d7" }, "downloads": -1, "filename": "pygolang-0.0.1.post1.tar.gz", "has_sig": true, "md5_digest": "b61271c3acf43c6d5385d377d8dd5b9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57063, "upload_time": "2019-05-10T04:28:20", "url": "https://files.pythonhosted.org/packages/86/b7/94d818145b5e4bfb91b24743bd7af52384e5151896aa06c151263f2d0280/pygolang-0.0.1.post1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "14ab9abfc9b897710e57c3dfa63b8b6a", "sha256": "ea893da071c5447d555a78a301dca9ed2b1a6599f2635ac632b82c2ddb7c14a4" }, "downloads": -1, "filename": "pygolang-0.0.2.tar.gz", "has_sig": true, "md5_digest": "14ab9abfc9b897710e57c3dfa63b8b6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57004, "upload_time": "2019-05-16T17:33:16", "url": "https://files.pythonhosted.org/packages/97/fa/44240c4f5619294a57bb215c7ac4c2a901d333c88c81179987800aa80106/pygolang-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "e6547d58c2a902534a436f930dd56120", "sha256": "2ee68b124023f27b205910c9ad0f5eaba1aa7055301b4b767a12a078d6b66834" }, "downloads": -1, "filename": "pygolang-0.0.3.tar.gz", "has_sig": true, "md5_digest": "e6547d58c2a902534a436f930dd56120", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 92366, "upload_time": "2019-08-29T12:37:11", "url": "https://files.pythonhosted.org/packages/65/d8/2ed42763857d9f64b89f579e06ec2cf9fd972991958331861582c984e0ff/pygolang-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "d76db8ca78d88611919938bf42bcef1d", "sha256": "e59f254e5981da3d0b65ddd6c24512a76595160a81094e8f505b40e1d1d78f1e" }, "downloads": -1, "filename": "pygolang-0.0.4.tar.gz", "has_sig": true, "md5_digest": "d76db8ca78d88611919938bf42bcef1d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 103085, "upload_time": "2019-09-17T06:47:48", "url": "https://files.pythonhosted.org/packages/ac/65/0f5d58daf312885e38d6a11b6ab8e7d104d2918a2d9c1a432dc46ff16a3c/pygolang-0.0.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d76db8ca78d88611919938bf42bcef1d", "sha256": "e59f254e5981da3d0b65ddd6c24512a76595160a81094e8f505b40e1d1d78f1e" }, "downloads": -1, "filename": "pygolang-0.0.4.tar.gz", "has_sig": true, "md5_digest": "d76db8ca78d88611919938bf42bcef1d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 103085, "upload_time": "2019-09-17T06:47:48", "url": "https://files.pythonhosted.org/packages/ac/65/0f5d58daf312885e38d6a11b6ab8e7d104d2918a2d9c1a432dc46ff16a3c/pygolang-0.0.4.tar.gz" } ] }