Поскольку map()
возвращает значение из потоков, поэтому я использую его для возврата True или False, а затем подсчитываю их в главном потоке.Таким образом, потоки не пытаются использовать один и тот же l
, что часто создает проблемы.
from multiprocessing.pool import ThreadPool
pool = ThreadPool(32)
def func(e):
return "$" in e
data = ['$','$','x','$','$','x','$','$','x','x','$','x','x']
results = pool.map(func, data)
print(results)
l = dict()
l["included"] = results.count(True)
l["not included"] = results.count(False)
print(l)
Результат
[True, True, False, True, True, False, True, True, False, False, True, False, False]
{'included': 7, 'not included': 6}
Проблема в том, что один поток изменяет значение, ноон не блокирует доступ к переменной, поэтому в то же время другой поток получает старое значение вместо нового, и он изменяет это старое значение и возвращает его в переменную, что приводит к неверному результату.Потоки должны будут использовать блокировку или семафору, чтобы заблокировать доступ к переменной.