Setting the width or the flex-basis of the child elements to ~half the parent width should put two items per row.
Using 50% you will probably need box-sizing: border-box to fit. Or you can have it a bit under 50% and enable flex grow to fill the space, if you want all the width filling.
Again, all the flex-child classes seem redundant, I would just have .flex-parent > div or .flex-parent > * to select them.
That alone will select any element. When preceded by the parent class and > it selects any element which is a direct (next generation) child of that parent.
It is less efficient than just using div, so maybe use div if there will only ever be divs in the parent.
Using * will enable you to target mixed elements within the parent if they exist.