Incremented dict does not keep the value

Viewed 56

I have the following situation:

class Test:
  cities_visited: dict

  @staticmethod
  def prepare_city_dict(persons):
    Test.cities_visited = {}
    for i in range(len(persons)):
      name = persons[i].surname
      Test.cities_visited[name] = Test.create_visit()

  @staticmethod
  def create_visit():
    counter: dict = {"City1": 0, "City2": 0, "City3": 0}
    return counter

  @staticmethod
  def increment_visit(surname: str, key):
    counter_visit = Test.cities_visited[surname]
    current_value = counter_visit[key]
    print(current_value)
    counter_visit[key] = current_value + 1
    Test.cities_visited[surname] = counter_visit

At start-up I am calling Test.prepare_city_dict, and then I create a thread and do a lock and call other stuff, at some point I try to increment 2 cities:

Test.increment_visit("Dummy", "City1")
Test.increment_visit("Dummy", "City2")

If I am trying to log how many times a city was visited, only the 'City1' is correctly implemented. I am coming from a different language (which is pretty obvious I think :D), running my code in a docker container on the Windows OS, everything is incremented properly. Running the same configuration (container) under Linux OS, only the first 'City1' is properly incremented.

I taught it was a race condition, but unfortunately I cannot reproduce it and I cannot figure out what is going on.

+++ UPDATE:

class TestClass:

def main():
    Test.prepare_city_dict(persons)

    lock = threading.Lock()
    thread = threading.Thread(target=TestClass.process_message,
                                args=(lock, persons,))
    thread.start()

def process_message(lock, persons):
  lock.acquire()
  Test.increment_visit("Dummy", "City1")
  ..... -> lots of calculations 
  Test.increment_visit("Dummy", "City2")
  lock.release()
0 Answers
Related