必要です。マルチスレッドの動作はPythonでは異なりますが、グローバルインタープリターロックにより、Pythonバイトコードでアトミックでない操作でもロックが必要になります。
あなたの場合、あなたはあなたの関数のバイトコードを調べることができますtest(dis.dis(test)):
3 0 SETUP_LOOP 30 (to 33)
3 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 1 (1000)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 16 (to 32)
16 STORE_FAST 0 (i)
4 19 LOAD_GLOBAL 1 (count) # start of increment
22 LOAD_CONST 2 (1)
25 BINARY_ADD
26 STORE_GLOBAL 1 (count) # end of increment
29 JUMP_ABSOLUTE 13
>> 32 POP_BLOCK
>> 33 LOAD_CONST 0 (None)
36 RETURN_VALUE
ご覧のとおり、増分は2xload、update、storeでバイトコードレベルであるため、これは機能しません。増分は実際には4つの個別の操作であり、中断されないように保護する必要があります。
あなたの例ではcount += 1、バイトコードが示すように、を使用しても問題は残ります。
4 19 LOAD_GLOBAL 1 (count)
22 LOAD_CONST 2 (1)
25 INPLACE_ADD
26 STORE_GLOBAL 1 (count)