Streams can observe any number of paths; simply pass them as
positional arguments (or using the * operator):

stream = Stream(callback, *paths)

To start the observer in its own thread, use the start method:

observer.starts()

To start the observer in the current thread, use the run method
(it will block the thread until stopped from another thread):

observer.run()

The callback function will be called when an event occurs. A
FileEvent instance is passed to the callback and has 3 attributes:
mask, cookie and name. name parameter contains the path
at which the event happened (may be a subdirectory) while mask
parameter is the event mask [1].

To stop observation, simply unschedule the stream and stop the
observer:

observer.unschedule(stream)
observer.stop()

While the observer thread will automatically join your main thread at
this point, it doesn’t hurt to be explicit about this:

observer.join()

We often want to know about events on a file level; to receive file
events instead of path events, pass in file_events=True to the
stream constructor: