A Petri net is composed of places, transitions and arcs. Any place contains a given number of tokens, which represent resources. Transitions are connected to places through the arcs, and can turn resources into other resources: A transition can fire, consuming tokens living in places connected to its input, and producing tokens living in places connected to its output.
- Places are represented by circles;
- Tokens are represented by black dots in each circle;
- Transitions are represented by rectangles; transitions that can fire are colored green.
The diagram is interactive, try clicking on the enabled (green) transitions and see what happens.
An arc going from a place to a transition represents the transition input; the number alongside the arc signifies the number of consumed tokens. (To avoid clutter, we omit the numbers when they are equal to 1.)
An arc going from a transition to a place represents the transition output; the number alongside the arc signifies the number of produced tokens.
A transition can have any number of input arcs and any number of output arcs, including zero.
A Petri net should be thought of as representing some sort of system. Tokens are resources, and places are containers that hold resources of a given type. Transitions are processes that convert resources from one type to another. The numbers alongside the arcs identify how many resources of some kind a process needs to be executed, and how many resources of some other kind will be produced when the process finishes.
The study of reachability in Petri nets is expansive and a very important thing to consider to fully understand their computational properties. This net is an example of how in some cases, certain computations scale exponentially as new places are added. In this particular net, for each added bit, the path from the tokens going from the top row of places to the bottom, doubles. You can learn more about it in Pawel Sobocinski’s video, which explains open Petri nets.
This net can be thought of as having a producer unit on the left, and a consumer unit on the right, as the title suggests. The consumer unit needs the resources the producer unit creates in order to do its work. An example of this pattern is the producer as a function generating a data object, and the consumer, a function which takes this object as an input and manipulates it in some way.
Expressing events happening in parallel is often necessary. This net shows how a single, sequential process can be split into two branches which run in parallel and then sync. The concept of parallel computing is an important one.
If one imagines that the place on the far left and the place on the far right represent green light, then we, at the least, want to ensure that they are never on at the same time. This net represents such a protocol - a construct in which the undesired state is not possible.