Skip to main content

A threading library.

Project description

Codacy Badge Documentation Status

A threading library written in python. Help you build threaded app.

This module was originally included in ComicCrawler.

Features

  • Pause, resume, stop and restart thread.

  • Create child thread.

  • Create async task.

  • Communicate between threads with events.

  • Use channel to broadcast event.

Install

pip install pythreadworker

Usage example

Basic operations and event:

#! python3

# Always use worker.sleep. pyWorker would process event queue during
# waiting.
from worker import create_worker, listen, sleep

@create_worker
def increaser():
  count = 1

  @listen("SET_VALUE")
  def _(event):
    nonlocal count
    count = event.data

  while True:
    print(count)
    count += 1
    sleep(1)

while True:
  command = input("input command: ")

  if command == "start":
    increaser.start()

  elif command == "stop":
    increaser.stop()

  elif command == "pause":
    increaser.pause()

  elif command == "resume":
    increaser.resume()

  elif command.startswith("set"):
    increaser.fire("SET_VALUE", int(command[4:]))

  elif command == "exit":
    increaser.stop()
    break

Async task:

#! python3

from worker import aynsc_, sleep

def long_work(t):
  sleep(t)
  return "Finished in {} second(s)".format(t)

# The async task will be executed in another thread.
pending = async_(long_work, 5)

# Do other stuff here...

# Wait the thread to complete and get the result. If the task is already
# finished, it returns directly with the result.
print(pending.get())

Use Channel to broadcast event:

#! python3

from worker import Worker, Channel

channel = Channel()

def create_printer(name):
  printer = Worker()

  @printer.listen("PRINT")
  def _(event):
    print(name, "recieved", event.data)

  channel.sub(printer)
  return printer.start()

foo = create_printer("foo")
bar = create_printer("bar")

channel.pub("PRINT", "Hello channel!")

foo.stop()
bar.stop()

Child thread and event bubbling/broadcasting:

#! python3

from worker import Worker, sleep

def create_worker(name, parent):
  thread = Worker(parent=parent)

  @thread.listen("HELLO")
  def _(event):
    print(name)

  return thread.start()

parent = create_worker("parent", None)
child = create_worker("child", parent)
grand = create_worker("grand", child)

# broadcast/bubble is happened in main thread. It doesn't gaurantee the
# execution order of listeners.
parent.fire("HELLO", broadcast=True)
sleep(1)
grand.fire("HELLO", bubble=True)
sleep(1)

# stop a thread would also stop its children
parent.stop()

How it works

The module creates a event queue for each thread, including the main thread. When the functions provided by worker (e.g. sleep, Async.get) are called, they actually enter the event loop, so the module can process events, communicate with other threads, or raise an exception during the call.

Which also means that if you don’t use the function provided by the module, the module has no chance to affect your existing code. It should be easy to work with other frameworks.

API reference

http://pythreadworker.readthedocs.io/en/latest/

Notes

Changelog

  • 0.8.0 (Mar 26, 2017)

    • Add print_traceback option to Worker.

    • Ability to use later as decorator.

    • Drop __all__ in __init__.py.

    • function rename: async -> async_, sync -> await_.

    • Async now extends Worker and needs start() to run.

    • later() now doesn’t use current thread as target by default. To use current thread as target, pass target=True.

    • Various function are able to used as decorator, including await_, async_, later.

    • Drop daemon Thread, use daemon Worker.

    • Add Worker.wait_until.

    • Add create_worker.

    • Refactor.

  • 0.7.0 (Feb 26, 2017)

    • Improve docs.

    • Drop def target(thread) syntax, use current() to get current thread instead.

    • Use pylint and sphinx.

    • Export more shortcuts.

  • 0.6.0 (Jul 1, 2016)

    • Add thread.later.

  • 0.5.1 (Apr 22, 2016)

    • Use float in sleep function.

  • 0.5.0 (Apr 22, 2016)

    • Add sync.

  • 0.4.0 (Apr 20, 2016) breaking change

    • Interface completely changed

    • Drop Message.put, .get

    • Drop UserWorker

    • Drop Worker.create_child. Use parent option in constructor instead.

    • Drop global_cleanup

    • Add sleep

    • Add current

    • Add Channel

    • Add Listener.priority

    • Add daemon option to Worker

    • Worker.cleanup –> Worker.update

    • Worker.message –> Worker.fire

    • Worker.wait_message –> Worker.wait_event

    • Worker.message_loop –> Worker.wait_forever

  • 0.3.0 (Jun 14, 2015)

    • Catch BaseException.

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

pythreadworker-0.8.0.tar.gz (8.6 kB view details)

Uploaded Source

Built Distribution

pythreadworker-0.8.0-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

Details for the file pythreadworker-0.8.0.tar.gz.

File metadata

File hashes

Hashes for pythreadworker-0.8.0.tar.gz
Algorithm Hash digest
SHA256 aa367fe9b302ab7909d441017dc88cf41d65312417a65ad09597a7eb0f74b954
MD5 1b8021d6194bc6e44e34192ed560aa93
BLAKE2b-256 1c9858fc9877a3c2acdc7d95df40f7681b764b9b5c73548fec48ad1e8c869776

See more details on using hashes here.

File details

Details for the file pythreadworker-0.8.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pythreadworker-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7e034203eade91ac63bd79e179402cffccc1ef1554c8a46570ab524652e36a7b
MD5 723940ca1984c8c3df481d8536826c1a
BLAKE2b-256 1b3aac98b80e6513eecbbaf73d03e1ff5f382c8bacd7982d0e1ebfe32a4dee28

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