Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
10 / 9 / 1
Регистрация: 23.11.2019
Сообщений: 159

Результат многопоточной проги не совпадает

04.07.2023, 19:58. Показов 532. Ответов 0

Студворк — интернет-сервис помощи студентам
Добрый день!
изучаю многопоточность в питоне - в других языках такой тест не проводил и вопросом этим не задавался соответственно

Проблема в результате, который выводит репортер
вот файлы
main.py
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import threading
 
 
from first import foo
import reporter  as r
 
if __name__ == '__main__':
    r.reporter = r.Reporter()
    thr = threading.Thread(target=foo)
    thr.name = 'Danon'
    thr.start()
    r.reporter.start()
    while True:
        r.reporter.add()


first.py
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
import test_polygon.log.d.reporter  as r
 
 
 
def foo():
    while True:
        r.reporter.add()


reporter.py
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import threading
import time
 
 
class Reporter(threading.Thread):
    def __init__(self):
        super().__init__()
        print('Reporter init')
        self.lock = threading.Lock()
        self.data = 0
        self.counter = 0
        self.info = {}
 
    def add(self):
        with self.lock:
            self.data += 1
            name = threading.current_thread().name
            if name not in self.info:
                self.info[name] = 0
            else:
                self.info[name] += 1
 
 
    def run(self):
        while True:
            time.sleep(2)
            with self.lock:
                data = self.data
                info = self.info
                self.info = {}
                self.data = 0
            print(f'iter: {self.counter} - {data}\n{info}\n')
            self.counter += 1
 
 
 
reporter: Reporter = None


То есть результат в переменной дата это сумма чисел из словаря info, но если сложить эти числа, то есть некоторая ошибка, что не очень понятно как произошло, поскольку работа с общими данными идёт через lock
(Даже с одним потоком есть ошибка в единицу)

Вот сам вывод
Кликните здесь для просмотра всего текста

Reporter init
iter: 0 - 431538
{'MainThread': 431537}

iter: 1 - 412741
{'MainThread': 412740}

iter: 2 - 414768
{'MainThread': 414767}

iter: 3 - 418871
{'MainThread': 418870}

iter: 4 - 311104
{'MainThread': 210222, 'Danon': 100880}

iter: 5 - 280834
{'Danon': 111205, 'MainThread': 169627}

iter: 6 - 285294
{'MainThread': 166680, 'Danon': 118612}

iter: 7 - 283860
{'MainThread': 168609, 'Danon': 115249}

iter: 8 - 282832
{'Danon': 120344, 'MainThread': 162486}

iter: 9 - 284118
{'MainThread': 176666, 'Danon': 107450}

iter: 10 - 282402
{'MainThread': 168700, 'Danon': 113700}

iter: 11 - 282836
{'MainThread': 164211, 'Danon': 118623}

iter: 12 - 283773
{'MainThread': 163026, 'Danon': 120745}

iter: 13 - 284151
{'Danon': 112005, 'MainThread': 172144}

iter: 14 - 271418
{'Danon': 115708, 'MainThread': 155708}

iter: 15 - 240506
{'MainThread': 129433, 'Danon': 111071}

iter: 16 - 243545
{'MainThread': 113012, 'Danon': 130531}

iter: 17 - 277548
{'MainThread': 168065, 'Danon': 109481}

iter: 18 - 283717
{'Danon': 101539, 'MainThread': 182176}

iter: 19 - 283949
{'MainThread': 168450, 'Danon': 115497}

iter: 20 - 281824
{'MainThread': 175360, 'Danon': 106462}

iter: 21 - 277140
{'Danon': 118213, 'MainThread': 158925}

iter: 22 - 268208
{'Danon': 123156, 'MainThread': 145050}

iter: 23 - 283101
{'MainThread': 166239, 'Danon': 116860}

iter: 24 - 285126
{'MainThread': 171910, 'Danon': 113214}

iter: 25 - 277347
{'MainThread': 165742, 'Danon': 111603}

iter: 26 - 284057
{'Danon': 112546, 'MainThread': 171509}

iter: 27 - 271561
{'Danon': 137457, 'MainThread': 134102}

iter: 28 - 274834
{'MainThread': 144596, 'Danon': 130236}

iter: 29 - 286293
{'Danon': 126941, 'MainThread': 159350}

iter: 30 - 277326
{'Danon': 124333, 'MainThread': 152991}

iter: 31 - 283023
{'Danon': 111647, 'MainThread': 171374}

iter: 32 - 276257
{'Danon': 141830, 'MainThread': 134425}


Process finished with exit code -1



Добавлено через 4 минуты
Буквально пять минут подумал дополнительно и понял, что мой тупняк
поскольку поток добавил единицу, то он в словаре должен записать не ноль, а 1

Добавлено через 1 минуту
Вот так
Python
1
2
3
4
5
6
7
8
    def add(self):
        with self.lock:
            self.data += 1
            name = threading.current_thread().name
            if name not in self.info:
                self.info[name] = 1 # Здесь 1, а не 0
            else:
                self.info[name] += 1
Кнопки удалить не вижу, так что таким же не внимательным пусть висит напоминанием о внимательности
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.07.2023, 19:58
Ответы с готовыми решениями:

Глюк с выводом результата многопоточной проги
Здраствуйте. Сделал прогу, в которой 2 потока должны выполнить функцию Gauss с одной из половин массива. Синхронизация выполняется при...

Неправильный результат работы проги на сервере
Привет всем! Была поставлена задача - спарсить данные с сайта и перенести в google docs. Программу я написал, обычное консольное...

Результат деления в программе не совпадает с ожидаемым
Здравствуйте В университете преподаватель привел нам пример программы деления с расширениями CBW и CWD. MOV Dl, 59H MOV AL, DL ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.07.2023, 19:58
Помогаю со студенческими работами здесь

Вычислить выражение - результат не совпадает с ожидаемым
.686 ; в программе будут использоваться команды процессора Pentium Pro .model flat, stdcall option casemap :none include...

Результат работы кода не совпадает с ожидаемым
что не так с точностью кто то может объяснить static void Main() { Console.Write("Введите n = "); ...

Результат шифрования AES256 не совпадает с ожидаемым
Все работает нормально, текст шифруется и дешифруется, но результат шифрования не совпадает с такими онлайн сервисами как -...

Вычислить значение выражения: результат не совпадает с ответом
пересчитал вручную, ничего не вышло. такой ответ как в задании не получается. помогите пожалуйста. #include <iostream> #include...

Вычисление функции рядом Тейлора. Не совпадает результат
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от дггач до #кон с шагом dx с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru