Ideally, there should not be any blocking operations in PEs. However, this only applies if you don't need any external data, or that you can load all external data in memory upon initialization. In some cases, this is not possible, and I/O will be needed. Retrieved data can then be cached. It's much better if the stream is not blocked (provided you don't need ordering), and we certainly don't want to let PEs manage threads internally (that would mess the lifecycle management of PEs).
In addition, parallelizing the processing of streams may also help to increase throughput, and it is something we had been contemplating, but that we preferred to focus on in a later release. Daniel's proposal is a good start, with reasonable defaults, and remains optional. We could later improve this mechanism and provide more flexibility / performance.