In Section 3.1 we develop recursions to construct queueing processes in continuous time. This shows that a queueing system can be characterized by a few elements; Section 3.2 introduces useful notation for this purpose. Section 3.3 shows how to implement these recursions in Python and visualize the results. Some processes of interest, such as the number of jobs \(L(t)\) in the system, cannot be expressed directly by recursion. Section 3.3 and Section 3.4 introduce new ideas to simulate \(L(t)\) and other, more complex, queueing processes. The models of these two sections are simple, but cannot capture complex systems such as multi-server queues with heterogeneous service rates. Therefore, in Section 3.5 we extend the ideas of Section 3.3 and Section 3.4 to discrete-event simulation. Section 3.6 then applies this framework to several examples, including queues with heterogeneous server speeds and priority scheduling.