The problem has been solved.
The root cause is not in parent and child, that named pipe also worked very well. The problem is that parent actually is a child too, it starts by another process by using subprocess.Popen(). Then, actually, we have a grandparent, parent, child. Between grandparent and parent, we have a pipe to communicate with each other, parent writes in it, and grandparent reads from it. This pipe get filled, then parent get blocked when writing, it can not read message from that named pipe as well.