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

Работа с потоками Thread

07.11.2024, 05:55. Показов 636. Ответов 9

Студворк — интернет-сервис помощи студентам
Всем привет.
Пытаюсь разобраться с принципом работы потоков, но не совсем пока понятно, кто знает поправьте.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import threading
import time
 
 
def worker(number):
    while True:
        print ('Получена цифра: ' + str(number) + '\n')
        time.sleep(1)
 
for i in range(4):
    arr_list = []
    arr_list.append(i)
    thread = threading.Thread(target=worker, args=(arr_list,))
    thread.start()
Если запустить данный скрипт, то после завершения основного цикла и передачи в поток 0, 1, 2, 3, в потоке поочередно будут выводиться эти цифры в беспорядочном положении. Мне же нужно, чтобы при передачи в поток 0 бесконечно выдавался 0, при передаче 1, единица и т. д. Поток же вроде один создаётся, переменная одна передается, почему значения в потоке идут накопительно? Как очистить или как тут правильно организовать передачу данных без завершения потока? Пробовал через queue тоже самое получается, в потоке данные одной переменной накапливаются.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.11.2024, 05:55
Ответы с готовыми решениями:

Работа с потоками
Всем привет. Есть мультипотоки которые собирают из файла логин , пароль и запускают . Я не как не могу организовать добавление в...

Работа с потоками, правильный ли такой код?
Здравствуйте, вылетает код по неизвестным причинам в случайный момент времени (ошибок нет, try/catch все описаны). def...

Работа с потоками thread
Необходимо распараллелить вычисление интеграла (методом прямоугольников), но иногда программа, во-первых, вычисляет неправильно сам...

9
4 / 4 / 0
Регистрация: 30.01.2023
Сообщений: 19
07.11.2024, 13:22
Если честно - ничего не понятно, напиши пример, что должно выводить в консоль. Ты же поток запускаешь, и нигде не останавливаешь, с чего б ему не выполняться?
0
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
07.11.2024, 13:39  [ТС]
Поток выполняется, только значения переменной с каждым разом, как я передаю новое значение не заменяется, а добавляется к предыдущему.
Что я ожидаю, что передавая в бесконечный поток переменную со значением 0, будет выводиться 0, далее, когда я передам значение 1, будет выводиться 1, передам 2, будет выводиться 2. В данном случае выводится сначала 0, затем 0, 1, затем 0, 1, 2 или 2, 1, 0 или 2, 0, 1 и в таком роде, т. е. значения добавляются. Хотя может просто потоки создаются новые и в каждом потоке выводится своё значение, но опять же, я создаю поток с одним именем. Что-то я по поводу этого ничего не нашёл, либо не догнал, тогда, как сделать, чтобы всё работало в одном потоке или как завершать предыдущий поток при передаче нового значения?
0
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 590
07.11.2024, 13:43
- VKont, я немного переделал Ваш пример. Разберитесь в его работе.
По-моему все говорит само за себя:
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
import threading
import time
 
MAX_COUNT = 8
 
 
def worker(thr_ind):
    print(f"Поток[{thr_ind}]: - Начал работу")
    num = 0  # счетчик секунд
    while True:
        time.sleep(1)
        num += 1
        print(f"  Поток[{thr_ind}] -> num: {num}")
        if num >= MAX_COUNT:  # условие прекращения очередного Потока
            print(f"Поток[{thr_ind}]: - Завершил работу")
            break
 
 
# обращение:
arr_list = []
for i in range(4):
    arr_list.append(i)
    # thread = threading.Thread(target=worker, args=(arr_list,))
    thread = threading.Thread(target=worker, args=(arr_list[-1],))
    thread.start()
1
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
07.11.2024, 14:07  [ТС]
Цитата Сообщение от Staut Посмотреть сообщение
По-моему все говорит само за себя:
Подождите проблема не в потоке, а в массиве? Т. е. arr = [] не обнуляет же массив, я чёт тупанул точно, поэтому значения постоянно добавляются. Нужно же очищать arr.clear().
1
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 590
07.11.2024, 21:05
- VKont, прошу меня тоже простить! Спешил, где-то изменил, а где-то забыл.
Правильнее был бы вот такой код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from threading import *
import time
 
MAX_COUNT = 8
 
 
def worker(thr_ind):
    print(f"Поток[{thr_ind}]: - Начал работу")
    num = 0
    while True:
        # print('Получена цифра: ' + str(number) + '\n')
        time.sleep(1)
        num += 1
        print(f"  Поток[{thr_ind}] -> num: {num}")
        if num >= MAX_COUNT:  # условие прекращения очередного Потока
            print(f"Поток[{thr_ind}]: - Завершил работу")
            break
 
 
# обращение:
for i in range(4):
    thread = Thread(target=worker, args=(i,))
    thread.start()
- Здесь никакой массив вообще не нужен! О каком массиве Вы говорите?
Вы создаете 4 Потока, привязываете к каждому Потоку функцию-worker и передаете каждому Потоку его Индекс.
И все работает. Попробуйте ...
1
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
07.11.2024, 21:20
Staut, на бумаге всё гладко
а если мне нужно сделать 1600 замен в тексте, то разбиваю на 4 потока 4х400 и сделает быстрей?
ну ладно, а если мне нужно сделать эти замены именно друг за другом, потому как сделав первую замену текст уже изменяется и как быть?
0
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 590
07.11.2024, 21:28
- Ципихович Эндрю, - более тонкая и сложная работа с Потоками, а не этот простейший,
демонстрационный случай.
0
10 / 10 / 0
Регистрация: 07.10.2016
Сообщений: 196
08.11.2024, 02:28  [ТС]
Цитата Сообщение от Staut Посмотреть сообщение
- Здесь никакой массив вообще не нужен! О каком массиве Вы говорите?
Нет, нет, всё решено! Спасибо за помощь, вы своим кодом мне показали мою ошибку, проблема именно с массивом. Я работаю над большим проектом и уже мозги свернулись в узел, продумывая глобальные решения, я совсем упустил из вида простые ошибки начинающего и вылетело из головы, что arr = [] это объявление массива, а не очистка. Поэтому благодаря Вам и вашему примеру я сразу свою ошибку нашёл. Вот так иногда полезно поговорить с коллегами программистами, чтобы мозги развернулись
1
98 / 81 / 14
Регистрация: 26.07.2013
Сообщений: 590
08.11.2024, 09:48
- Ну о добро VKont! Успехов в работе над проектом!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.11.2024, 09:48
Помогаю со студенческими работами здесь

Работа с потоками (Thread)
есть сервис, содержащий список ip адресов разделенный на треды по адресов в каждом, требуется добавление адресов в список, для этого нужно...

Работа с потоками (Thread)
Доброе время суток. У меня такая проблема. Написали программу в которой два потока которые выполняют одну операцию. В данных потока...

Работа с двумя потоками boost::thread
Есть следующий рабочий код: while (...) { ... th_end = ptr + (size_level - ptr)/2; //разбил на 2 половинки. конец одной есть...

работа с потоками. Thread error: неверный дескриптор(6)
Задание: Создайте два потока, считающие до 50000 и выводящие результат в компонент TLabel на форме. Один из потоков должен быть...

boost::thread() проблема с потоками.
Собственно создается два потока и запускаются следующим образом int main(). { thread1.join(); thread2.join(); ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru