You're right about edge cases in terms of input values, and right about issues with concurrency, but many of the issues you mention are solved by changing your metric.
Branch-level coverage tells you what percentage of codepaths are covered.
In other words, it would report 50% coverage for:
if a:
print "a yes"
else:
print "a no"
if b:
print "b yes"
else:
print "b no"
test 1: a = false, b = false
test 2: a = true, b = true
Branch-level coverage tells you what percentage of codepaths are covered.
In other words, it would report 50% coverage for: