Skip to main content

Run your coroutines and functions in child process or thread like the way using concurrent.futures.

Project description

Aplex

build coverage platform supported pythons package version license maintenance

Translation: 简体中文 | 繁體中文

Aplex is a Python library for combining asyncio with multiprocessing and threading.

  • Aplex helps you run coroutines and functions in other process or thread with asyncio.
  • Aplex provides a usage like that of standard library concurrent.futures, which is familiar to you and intuitive.
  • Aplex lets you do load balancing in a simple way if you need.

Installation

For general users, use the package manager pip to install aplex.

pip install aplex

For contributors, install with pipenv:

git clone https://github.com/lunluen/aplex.git
cd aplex
pipenv install --dev

or with setuptools

git clone https://github.com/lunluen/aplex.git
cd aplex
python setup.py develop

Usage

Definition to know:

A work is a callable you want to run with asyncio and multiprocessing or threading. It can be a coroutine function or just a function.

In below case, the work is the coroutine function demo.

Submit

You can submit your work like:

import aiohttp
from aplex import ProcessAsyncPoolExecutor

async def demo(url):
    async with aiohttp.request('GET', url) as response:
        return response.status

if __name__ == '__main__':
    pool = ProcessAsyncPoolExecutor(pool_size=8)
    future = pool.submit(demo, 'http://httpbin.org')
    print('Status: %d.' % future.result())

Note: If you are running python on windows, if __name__ == '__main__': is necessary. That's the design of multiprocessing.

Result:

Status: 200

Map

For multiple works, try map:

iterable = ('http://httpbin.org' for __ in range(10))
for status in pool.map(demo, iterable, timeout=10):
    print('Status: %d.' % status)

Awaiting results

Aplex allows one to await results with loop that already exists. It's quite simple.

Just set keyword argument awaitable to True!

For example:

pool = ProcessAsyncPoolExecutor(awaitable=True)

Then

future = pool.submit(demo, 'http://httpbin.org')
status = await future

How about map?

async for status in pool.map(demo, iterable, timeout=10):
    print('Status: %d.' % status)

Load balancing

In aplex, each worker is the process or thread on your computer. That is, they have the same capability computing. But, your works might have different workloads. Then you need a load balancer.

Aplex provides some useful load balancers. They are RoundRobin, Random, and Average. The default is RoundRobin.

Simply set this in contruction keyword argument:

from aplex.load_balancers import Average

if __name__ == '__main__':
    pool = ProcessAsyncPoolExecutor(load_balancer=Average)

Done. So easy. :100:

You can also customize one:

from aplex import LoadBalancer

class MyAwesomeLoadBalancer(LoadBalancer):
    def __init__(*args, **kwargs):
        super().__init__(*args, **kwargs)  # Don't forget this.
        awesome_attribute = 'Hello Aplex!'

    def get_proper_worker(self):
        the_poor_guy = self.workers[0]
        return the_poor_guy

See details of how to implement a load balancer at:

Worker loop factory

By the way, if you think the build-in asyncio loop is too slow:

import uvloop

if __name__ == '__main__':
    pool = ProcessAsyncPoolExecutor(worker_loop_factory=uvloop.Loop)

Like this?

Scroll up and click Watch - Releases only and Star as a thumbs up! :+1:

Any feedback?

Feel free to open a issue (just don't abuse it).

Or contact me: mas581301@gmail.com :mailbox:

Anything about aplex is welcome, such like bugs, system design, variable naming, even English grammer of docstrings!

How to contribute

Contribution are welcome.

Asking and advising are also kinds of contribution.

Please see CONTRIBUTING.md

License

MIT

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

aplex-1.0.1.tar.gz (500.7 kB view details)

Uploaded Source

Built Distribution

aplex-1.0.1-py2.py3-none-any.whl (35.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file aplex-1.0.1.tar.gz.

File metadata

  • Download URL: aplex-1.0.1.tar.gz
  • Upload date:
  • Size: 500.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.0 CPython/3.7.1

File hashes

Hashes for aplex-1.0.1.tar.gz
Algorithm Hash digest
SHA256 e393fabe502f827fcc02b7dda68489c9b8562ed10d38a58089f73b54fbef5ea9
MD5 c21477f83010c58fa7a85eb4d872ae71
BLAKE2b-256 cb979af8e96a68ba698c86f5a808cd8ce50b64380d015a84ac705fc0ea088aa3

See more details on using hashes here.

File details

Details for the file aplex-1.0.1-py2.py3-none-any.whl.

File metadata

  • Download URL: aplex-1.0.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 35.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.0 CPython/3.7.1

File hashes

Hashes for aplex-1.0.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 1f9e12bb3802703d475776055ded237cb64f69ccf96e496fa64374c0ad6eafab
MD5 41735ce6e6c7789df1a7eec94909cd72
BLAKE2b-256 ef67fc4f21422741b5cb9511f2a95d45290d8a15326c8184cfb640c47b3482dd

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