events

Windows has event objects which can be created and fired system-wide. This is useful for signalling between processes. Eg each of three cooperating processes could create the same event and then use a thread (cf event_handler below) which would block on the event to perform some useful action, for example a data reload. Python also has an event construct, based around the threading support module. Although it is intra-process only, its basic functionality is the same as the Windows events (set, reset, wait).

This module implements a common event interface, and offers a python version of it (PythonEvent) and a Windows version (Win32Event) where available. The module behaves perfectly well on Linux simply by not creating the Win32Event class. The original intention of the module was to wrap the Win32 event; the Python version was something of an afterthought. If I had time I could probably use the signal module to simulate, under Linux, the inter-process behaviour present in the Windows events.

Installing It

Unzip events.zip to somewhere temporary and then just
python setup.py install
as usual.

Example

common.py

SHARED_MEMORY_NAME = "shared_memory"
SHARED_MEMORY_SIZE = 16 * 1024

READY_TO_CONSUME = "ready_to_consume"
FINISHED_PRODUCING = "finished_producing"

producer.py

import mmap

import events

import common

shared_memory = mmap.mmap (0, common.SHARED_MEMORY_SIZE, common.SHARED_MEMORY_NAME)
ready_to_consume_event = events.Win32Event (common.READY_TO_CONSUME)
finished_producing_event = events.Win32Event (common.FINISHED_PRODUCING)

line_number = 0

while 1:
  ready_to_consume_event.wait ()
  shared_memory.write ("This is line %d\n" % line_number)
  line_number += 1
  finished_producing_event.set ()

consumer.py

import mmap
import time

import events

import common

shared_memory = mmap.mmap (0, common.SHARED_MEMORY_SIZE, common.SHARED_MEMORY_NAME)
ready_to_consume_event = events.Win32Event (common.READY_TO_CONSUME)
finished_producing_event = events.Win32Event (common.FINISHED_PRODUCING)

while 1:
  ready_to_consume_event.set ()
  finished_producing_event.wait ()
  print shared_memory.readline ()
  time.sleep (2)

Download

25th November 2003: events.py (v0.1, zipped - tiny)