Skip to main content

Go style CSP for Python

Project description

Forechan

go style asyncio channels.

Fully Typed with Generics, mypy ready.

Inspired by core.async from clojure.

Examples

Send & Recv

ch = chan(int)         # Chan[int]
await (ch << 2)        # or use `await ch.send(x)`
two = await ([] << ch) # or use `await ch.recv()`
assert two == 2

# `ch.close()` is idempotent
await ch.close()

Basic

if ch:
  # if `Chan[T]` is open

len(ch) # How many items are in `ch`

async with ch:
  # close `ch` after exiting lexical-scope

async for item in ch:
  # use `ch` as AsyncIterator

Select

async for ch, item in select(ch1, ch2, ch3, ...):
  if ch == ch1:
    ...
  elif ch == ch2:
    ...
  elif ch == ch3:
    ...

Wait Group

wg = wait_group()

for _ in range(5):
  async def cont() -> None:
    with wg:
      # do some work

  create_task(cont())

# will wait for all work to be completed
await wg.wait()

Synchronous

head = ch.try_peek() # can throw `ChanEmpty`
(ch < 2)             # or use `ch.try_send(2)` , can throw `ChanFull`
two = ([] < ch)      # or use `ch.try_recv()`  , can throw `ChanEmpty`
assert two == 2

Go -> Python

The following are roughly equivalent

func fn() {
	// do things here
}
go fn()

When GOMAXPROCS=1

async def fn() -> None:
  # do things here

create_task(fn())

Common Concurrency Patterns

Consumer

async def consumer() -> None:
  async for item in ch:
    # do something with `item`, until `ch` is closed

Producer

def producer() -> Chan[int]:
  ch = chan(int)

  async def cont() -> None:
    # auto close `ch` when done
    async with ch:
      while ...:
        # send result `item` to downstream `ch`
        await (ch << item)

  create_task(cont())
  return ch

Series of Tubes

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

forechan-0.2.10.tar.gz (9.2 kB view details)

Uploaded Source

Built Distribution

forechan-0.2.10-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file forechan-0.2.10.tar.gz.

File metadata

  • Download URL: forechan-0.2.10.tar.gz
  • Upload date:
  • Size: 9.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.7

File hashes

Hashes for forechan-0.2.10.tar.gz
Algorithm Hash digest
SHA256 8274b46e92b6f5bb0d87e0223edf58bd9a901c96cb98c922ec7eeee0af7615b7
MD5 3ea51436e9401989c69fbb10290f98b9
BLAKE2b-256 21e899bd2dc81d01587552ee7a81f896edaf5ae6d0c44a6085ef4c1b841ae03b

See more details on using hashes here.

File details

Details for the file forechan-0.2.10-py3-none-any.whl.

File metadata

  • Download URL: forechan-0.2.10-py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.7

File hashes

Hashes for forechan-0.2.10-py3-none-any.whl
Algorithm Hash digest
SHA256 824dc45021a8ff00cf554a97cdb12bef8665d75c43b74b990b27d9e2f10ce897
MD5 7103438cd17dc1361479f09fdc93a8ca
BLAKE2b-256 eee5a4bbb6793382618ffcfefb132268525d698fd7deb58c8d8f33491044257e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page