Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Как сделать python threading thread safe? Нужна помощь, ребята!

  1. Как сделать python threading thread safe? Нужна помощь, ребята!

    Привет всем! Я вот изучаю Python и столкнулся с прикольной задачкой. Мне нужно заставить многопоточную программу быть тредсейфовой, а то кидает странные ошибки. Как вообще сделать так, чтобы threading не ломался? Поделитесь кодом или идеями, как можно решать эти беды. Очень жду помощи!



  2. Ждём вас в нашем чате в Телеграмм ==>> @pythoneer_chat

    А ТАКЖЕ: Канал о Python, статьи и книги ==>>
    @pythoneer_ru

  3. Привет! Чтобы твои потоки не ломали друг друга, можно применять блокировки с помощью `threading.Lock()`. Вот пример кода:

    Программный код:

    import threading



    class BankAccount:

        
    def __init__(self):

            
    self.balance 0

            self
    .lock threading.Lock()

        

        
    def deposit(selfamount):

            
    with self.lock:

                
    temp self.balance

                temp 
    += amount

                self
    .balance temp



    account 
    BankAccount()



    def make_deposit():

        for 
    _ in range(1000):

            
    account.deposit(1)



    threads = []

    for 
    i in range(10):

        
    threading.Thread(target=make_deposit)

        
    threads.append(t)

        
    t.start()



    for 
    t in threads:

        
    t.join()



    print(
    f"Final balance: {account.balance}"
    Таким образом, каждый поток будет использовать лок, и проблемы с одновременной записью не будет.

  4. Цитата Сообщение от Виктор Иванович
    Привет! Чтобы твои потоки не ломали друг друга, можно применять блокировки с помощью `threading.Lock()`. Вот пример кода:

    Программный код:

    import threading



    class BankAccount:

        
    def __init__(self):

            
    self.balance 0

            self
    .lock threading.Lock()

        

        
    def deposit(selfamount):

            
    with self.lock:

                
    temp self.balance

                temp 
    += amount

                self
    .balance temp



    account 
    BankAccount()



    def make_deposit():

        for 
    _ in range(1000):

            
    account.deposit(1)



    threads = []

    for 
    i in range(10):

        
    threading.Thread(target=make_deposit)

        
    threads.append(t)

        
    t.start()



    for 
    t in threads:

        
    t.join()



    print(
    f"Final balance: {account.balance}"
    Таким образом, каждый поток будет использовать лок, и проблемы с одновременной записью не будет.
    Норм тема! Но иногда локи могут замедлять работу. Ты пробовал что-то типа RLock?

  5. Если хочется избежать всей этой возни с локами, попробуй воспользоваться библиотеками, которые сами по себе потокобезопасные. Например, `queue.Queue`, она с синхронизацией уже по дефолту.

  6. Цитата Сообщение от swetlan
    Если хочется избежать всей этой возни с локами, попробуй воспользоваться библиотеками, которые сами по себе потокобезопасные. Например, `queue.Queue`, она с синхронизацией уже по дефолту.
    В точку! Еще `concurrent.futures` удобная штука для таких дел.

  7. Еще можно заюзать `threading.Event`, чтобы координировать работу между потоками. Это как семафор, только проще.

  8. Цитата Сообщение от Раиса
    Еще можно заюзать `threading.Event`, чтобы координировать работу между потоками. Это как семафор, только проще.
    Да, но его нужно тоже аккуратно настраивать. Легко запутаться, если потоков много.

  9. Самый простой способ - вообще избегать shared state. Пусть каждое действие выполняется в своём потоке и не пересекается.

  10. Цитата Сообщение от Наталья Андреевна
    Самый простой способ - вообще избегать shared state. Пусть каждое действие выполняется в своём потоке и не пересекается.
    Согласен, но иногда без шардинга данных не обойтись. Тут всё от задачи зависит.

Страница 1 из 2 12 ПоследняяПоследняя