Работа с многопоточностью

lolzch

Client
Регистрация
04.05.2025
Сообщения
3
Благодарностей
1
Баллы
3
Создавал я проект и в моменте понял, что очень сильно не хватает многопотока. Как раз на этом моменте возникли проблемы.:(
Введу в курс дела, что делает мой проект -> :bs:
Запускаю проект далее из директории, где находятся профиля, добавляются данные в список. Далее при загрузки профиля берется случайная строчка и удаляется после взятия. Аналогично у меня также подгружается и прокси в профиль путем взятия строчки и её удаления.
( таким образом, я изначально хотел реализовать многопоток, но, почитав форум, увидел, что в этом способе есть подводные камни)

Мне нужно сделать так, чтобы в каждом потоке был индивидуальный профиль и прокси, ( после загрузки профиля выполняется небольшое действие на сайте) когда закончатся профиля, то и скрипт, соответственно, должен закончить своё выполнение.
Я прочитал достаточно много сообщений на форуме про многопоток и выявил для себя самый лучший вариант ( лично на мой взгляд, но могу быть неправ)

Этот вариант с созданием глобальной переменной. Как я вижу работу своего проекта, создается глобальная переменная. Далее эту переменную я подставляю в экшен операции над списком и получить строку ( путь к профилю) с номером глобальной переменной. То есть в последующий потоках значение просто должно увеличиваться на 1. Таким образом я по логике смогу избежать пересечение профилей и, соответственно, прокси.

Любая Ваша помощь будет очень важна для меня потому, что я ещё новичёк и не совсем понимаю как реализовать многопоточность в проекте ( это мой первый опыт работы с многопотоком)
 
Регистрация
05.04.2025
Сообщения
51
Благодарностей
13
Баллы
8
Глобальную переменную надо локировать, иначе потоки будут одновременно работать с ней и будет пересечение. это на C# делается.
На стандартных кубиках разбивают на 2 этапа, сначала берут строку из списка с удалением, если пустой список, тогда переводят на этап заполнения списка и потом обратно. Так как списки имеют встроенный локер, этот способ будет работать.
 

one

Client
Регистрация
22.09.2015
Сообщения
6 885
Благодарностей
1 285
Баллы
113
Сколько я не пробовал реализовать многопоток используя глобальную переменную, никак не получалось. В итоге пришел к решению с таблицей а потом перешел на БД (БД лучше) где указывал какая строка в данный момент в работе и ее трогать нельзя.
 
Последнее редактирование:
  • Спасибо
Реакции: lolzch и Sergodjan

Tvister

Client
Регистрация
09.09.2010
Сообщения
262
Благодарностей
36
Баллы
28
Далее при загрузки профиля берется случайная строчка и удаляется после взятия. Аналогично у меня также подгружается и прокси в профиль путем взятия строчки и её удаления.
Если берется строка с удалением ниче мудрить не надо. В рамках одного кубика, т.е. взять строку с удалением, стандартные локи работают хорошо. Так что потоки пересекаться не будут .
 
  • Спасибо
Реакции: lolzch

lidoff

Client
Регистрация
15.04.2024
Сообщения
48
Благодарностей
6
Баллы
8
в моем шаблоне для рассылки email я реализовал это с помощью базы данных mysql.
создал таблицу temp в которую добавляются номера профилей. значения в столбце с номерами профилей должны быть уникальны (data VARCHAR (255) UNIQUE).
когда первый поток начинает работу с профилем он добавляет номер профиля в temp, если второй второй поток возьмет тот же профиль и попытается добавить его номер в temp, то действие завершиться по badend'у и второй поток должен будет взять следующий профиль.
протестировано при запуске в 100 потоков.
на видео пример запуска в 5 потоков - https://t.me/gsenderpro/42
 

S10n4eg

Client
Регистрация
25.06.2014
Сообщения
327
Благодарностей
57
Баллы
28
Сделай список - промежуток и туда записывайте профиля которые сейчас работают, потом по гуд и бед енду удалить из промежутка профиль
 

lolzch

Client
Регистрация
04.05.2025
Сообщения
3
Благодарностей
1
Баллы
3
Сколько я не пробовал реализовать многопоток используя глобальную переменную, никак не получалось. В итоге пришел к решению с таблицей а потом перешел на БД (БД лучше) где указывал какая строка в данный момент в работе и ее трогать нельзя.
Насчет БД на форме слышал, что так лучше всего, но проблема в нехватке знаний и думаю изначально попробую способ, который предложил Tvister. Всему своё время всем спасибо за помощь если возникнут проблемы то обязательно еще черкану пару строчек здесь на форме всем Вам я очень благодарен:az:
 
  • Спасибо
Реакции: one

lolzch

Client
Регистрация
04.05.2025
Сообщения
3
Благодарностей
1
Баллы
3
Если берется строка с удалением ниче мудрить не надо. В рамках одного кубика, т.е. взять строку с удалением, стандартные локи работают хорошо. Так что потоки пересекаться не будут .
Я сделал простенький скрипт и провел пару тестов и вроде как он работает!:bq:
Но на всякий случай прикрепил к этому сообщению свой проект (в нем все очень элементарно, каждое действие подписано)
Кому не сложно можете, пожалуйста, проверить скрипт все ли так сделал или где то нужно что то поменять.
Заранее хочу выразить свою благодарность! Спасибо Вам всем огромное кто остался неравнодушным :bt:
 

Вложения

Tvister

Client
Регистрация
09.09.2010
Сообщения
262
Благодарностей
36
Баллы
28
Я сделал простенький скрипт и провел пару тестов и вроде как он работает!:bq:
Но на всякий случай прикрепил к этому сообщению свой проект (в нем все очень элементарно, каждое действие подписано)
Кому не сложно можете, пожалуйста, проверить скрипт все ли так сделал или где то нужно что то поменять.
Заранее хочу выразить свою благодарность! Спасибо Вам всем огромное кто остался неравнодушным :bt:
Вот этот кубик сам возьмет с локом (внутри одного кубика уже есть стандартные локи). Т.е. никакой другой поток эту строку не возьмет, если строка берется с удалением.
133382

Этот уже не нужно.
133383

А так все верно, пересекаться профили не будут.
 

Tvister

Client
Регистрация
09.09.2010
Сообщения
262
Благодарностей
36
Баллы
28
А так все верно, пересекаться профили не будут.
 
  • Спасибо
Реакции: lolzch

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)