The push model works well for non-blocking channels and pull model works well for blocking streams.
Say you have an event loop, reading from a non-blocking socket e.g. NIO and you have a piece of data. For this model you want push, so you can push the data you have and move onto some other work.
For a pull model, your parser tells you when you need to read more data. This makes sharing that thread with another one more difficult. The common solution for NIO being, to read the entire unparsed document into memory first and then passing it to the pull parser. Obviously this doesn't work so well for low latency or large documents.