Skip to main content

submitting cpu-bound tasks to processes and io-bound tasks to threads

Project description

Write a classic sequential program. Then convert it into a parallel one.


It runs faster.

What if not?

Don’t use it.


for image in images:
    create_thumbnail(image)       # original

for image in images:
    fork(create_thumbnail, image) # parallelized explicitly

for image in images:
    create_thumbnail(image)       # parallelized implicitly (read below)

What about return values?

As usual:

result = fork(my_func, *args, **kwargs)

It’s a proxy object that behaves almost exactly like the real return value of my_func. Furthermore, it evaluates only if needed; also in combination with operators (like +, - etc.).

What happens to exceptions?

Their original (sequential) tracebacks are preserved. That should make debugging easier. However, don’t try to catch exceptions. You better want to exit and see them.

Speaking of threads …

and processes? fork will take care of that for you.

You can assist fork by decorating your functions (not decorating defaults to cpu_bound):

def call_remote_webservice():
    # implementation

def fib(n):
    # naive implementation of Fibonacci numbers

@unsafe # don't fork; run sequentially
def weird_side_effects(*args, **kwargs):
    # implementation

Parallelize implicitly?

If you don’t like the fork calling syntax, you can convert certain functions into stand-alone forks.

Use with caution.

def create_thumbnail_by_webservice(image):
    # implementation

def create_thumbnail_by_bare_processing_power(image):
    # implementation

# the following two lines spawn two forks



  • easy to give it a try / easy way from sequential to parallel and back
  • results evaluate lazily
  • sequential tracebacks are preserved
  • it’s thread-safe / cascading forks possible
  • compatible with Python 2 and 3


  • weird calling syntax (no syntax support)
  • type(result) == ResultProxy
  • not working with lambdas due to PickleError
  • needs fix:
    • fix exception handling somehow
    • not working with coroutines (asyncio) yet

Project details

Download files

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

Files for xfork, version 0.25
Filename, size File type Python version Upload date Hashes
Filename, size xfork-0.25-py2-none-any.whl (4.4 kB) File type Wheel Python version py2 Upload date Hashes View hashes
Filename, size xfork-0.25-py3-none-any.whl (4.4 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size xfork-0.25.tar.gz (5.1 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page