Вы можете использовать select.select (доступно в Unix и Windows).
while True:
rlist, wlist, xlist = select.select([client, proc.stdout], [], [])
Вызов select.select
будет блокироваться до тех пор, пока сокет client
или proc.stdout
не будут готовы к чтению.
rlist
содержит подмножество [client.stdin, proc.stdout]
, которое готово к чтению.
Пример его использования (хотя и для другой проблемы) можно найти здесь .