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

Автозакрытие Thread после выполнения

22.06.2017, 20:20. Показов 5192. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть в чем имею такой скрипт

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 urllib2
import time
import json
import threading
 
 
BBBBB = open("ddddd.txt", "a")
def scan(aaaaa):
    urlRequest = urllib2.Request("https://xxx=" + aaaaa)
    data = urllib2.urlopen(urlRequest).read()
    json_data = json.loads(data)
    if json_data["result"]>"0":
            BBBBB.write("BBBBB of " + aaaaa + " is " + str(json_data["result"]) + "\n") 
    print ("BBBBB of " + aaaaa + " is " + str(json_data["result"]) + "\n")
 
def main():
    f = open("rass1.txt", "r")
    for line in f:
        t = threading.Thread(target=scan, args=(line,))
        t.daemon = True
        time.sleep(0)
        t.start()
 
if __name__ == '__main__':
    main()
Проблема в том что со временем я получаю
Python
1
2
3
  File "G:\python\lib\threading.py", line 736, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread
Пробовал писать exit() конце функции scan, все равно ловлю thread.error , также пробовал писать BBBBB.close() в конце функция скана и нитей. Тогда периодами ловлю I/O error иза частоты закрытий файла. Нити почему то просто не закрываются , подскажите решение.

Добавлено через 18 минут
с t.join() не получается тогда все ставится одно поточным, если использовать t1 t2 t3 тогда все просто дублируется. Не пойму как сделать

Добавлено через 5 часов 7 минут
Некто не делал многопоточность в питоне и не сталкивался с этим бредом ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2017, 20:20
Ответы с готовыми решениями:

Каково будет значение переменной k после выполнения следующего оператора k = k++; если до его выполнения k равнялось 6?
варианты ответов a) 8 b) 6 c) 7 d) 9 помогите зарание спасибо

Результат выполнения программы в консоли пропадает после выполнения скрипта
нужно отпарсить файл , но мне надо видеть что выводит сценарий , иначе мне его неотладить. Запускаю файл вот так python index.py

Thread после выполнения закрывается?
Добрый день!) подскажите такую штуку. есть поток Thread ProcessThread = new Thread(new Runnable() { @Override ...

28
17 / 17 / 11
Регистрация: 17.03.2017
Сообщений: 109
23.06.2017, 11:29
tseriess, Многопоточность частое явление (как для меня) только я решаю эту проблему другим способом, без демонов:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import threading
 
 
def function(a,b):
    for i in range(a,b):
        print('{}\n'.format(i))
 
 
def startThread(a,b):
    threading.Thread(target = function, args = (a,b)).start()
 
for i in range(5):
    startThread(i*100,(i+1)*100)
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
23.06.2017, 11:41
Slice_, обьекты потоков нужно складывать в список или ещё куда-то, иначе gc может их уничтожить. Твой код не валиден.
0
17 / 17 / 11
Регистрация: 17.03.2017
Сообщений: 109
23.06.2017, 11:47
alex925, что такое gc? и как теперь ?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import threading
 
threadArray =[]
def function(a,b):
    for i in range(a,b):
        print('{}\n'.format(i))
 
 
def startThread(a,b):
    threadArray.append(threading.Thread(target = function, args = (a,b)))
    threadArray[-1].start()
 
for i in range(5):
    startThread(i*100,(i+1)*100)
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.06.2017, 11:56
Цитата Сообщение от Slice_ Посмотреть сообщение
что такое gc?
Сборщик мусора.

Добавлено через 2 минуты
Цитата Сообщение от tseriess Посмотреть сообщение
Проблема в том что со временем я получаю
Может наплодилось слишком много потоков?
Как бы на каждую строчку по потоку...
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
23.06.2017, 18:21  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
бьекты потоков нужно складывать в список или ещё куда-то, иначе gc может их уничтожить. Твой код не валиден
кол для питона 2.7.13 и он вполне работоспособен, только вот проблема что бесконечно плодит потоки
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
23.06.2017, 18:29
Цитата Сообщение от tseriess Посмотреть сообщение
кол для питона 2.7.13 и он вполне работоспособен
То, что код как-то там запускается и работает, это не значит, что он не содержит ошибки.
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
23.06.2017, 18:31  [ТС]
Цитата Сообщение от Slice_ Посмотреть сообщение
tseriess, Многопоточность частое явление (как для меня) только я решаю эту проблему другим способом, без демонов:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import threading
 
threadArray =[]
def function(a,b):
    for i in range(a,b):
        print('{}\n'.format(i))
 
 
def startThread(a,b):
    threadArray.append(threading.Thread(target = function, args = (a,b)))
    threadArray[-1].start()
 
for i in range(5):
    startThread(i*100,(i+1)*100)
Можете прокоментировать что делают строки кода ? ато если честно я не особо понимаю что делает этот код, и как его применить к моему.

Мой код переходит по урл парсит значение с json в поле "result" "0"
проверяет если число "0" больше нуля он пишет строку на которою выдало любое значение больше нуля в файл.

Но проблема в том что потоки не как не ограничены в моем коде и в результате они открываются "до упора"

В идеале мне нужно что бы открылось максимум нужное количество потоков и в них уже все себе выполнялось, а не как сейчас на каждое действие новый поток и старые висят мертвым грузом.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
23.06.2017, 18:48
Цитата Сообщение от tseriess Посмотреть сообщение
идеале мне нужно что бы открылось максимум нужное количество потоков и в них уже все себе выполнялось, а не как сейчас на каждое действие новый поток и старые висят мертвым грузом.
Для таких целей лучше использовать асинхронку aiohttp.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
23.06.2017, 20:19
Создается N потоков читающих из потокобезопасной очереди.
А основной поток записывает в эту очередь строки.
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 10:22  [ТС]
а без a,b вариант кода ?

Добавлено через 17 минут
Немного по другому спрошу что мне сюда дописать
Python
1
2
3
4
5
6
7
def main():
    f = open("rass1.txt", "r")
    for line in f:
        t = threading.Thread(target=scan, args=(line,))
        t.daemon = True
        time.sleep(0)
        t.start()
что бы потоки работали корректно а не бесконтрольно открывались бесконечно. Или в питоне потоки чисто "абы было" и нет простой функции что сама допрет - открывать потоки без кончено идиотизм и надо их ограничить указанным количеством и гонять уже открытые по кругу, сажая в них новые данные. Без горождения всяческий километровых костылей.
0
17 / 17 / 11
Регистрация: 17.03.2017
Сообщений: 109
24.06.2017, 10:25
Это обязательно в потоках надо делать?, обычным циклом нельзя ?
a,b, были для разграничения информации
Python
1
2
3
4
5
def main():
    f = open("rass1.txt", "r")
    for line in f:
        t = threading.Thread(target=scan, args=(line,))
        t.start()
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 10:29  [ТС]
Обычным циклом скрипт как улитка работает, так как ждет получения данных.
А потоками открыл поток и пока там получит данные новый уже запросил другие, тем самым ускорение скрипта на количество потоков.
Как по другому сделать скрипт я не знаю, например вместо потоков множеством сессий.
0
17 / 17 / 11
Регистрация: 17.03.2017
Сообщений: 109
24.06.2017, 10:36
tseriess, так будет только хуже, скрипт будет кроме твоих операции работать с потоками, смотри в сторону мультипроцессорности

Добавлено через 5 минут
tseriess, так будет лучше, тем более ты сможешь пройдясь циклом проверить активны ли они и различную доп.информацию (если ты все таки остановишься на потоках)
Python
1
2
3
4
5
def main():
    f = open("rass1.txt", "r")
    for line in f:
        threadArray.append(threading.Thread(target=scan, args=(line,)))
        threadArray[-1].start()
1
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 11:23  [ТС]
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
38
39
40
41
42
43
44
import urllib2
import time
import json
import threading
n=0
bbbbb = []
 
def scan(aaaaa):
    urlRequest = urllib2.Request("https://xxx" + aaaaa)
    data = urllib2.urlopen(urlRequest).read()
    json_data = json.loads(data)
    print ("bbbbb of " + aaaaa + " is " + str(json_data["result"]) + "\n")
    if json_data["result"]>"0":
            bbbbb.append(aaaaa+" "+str(json_data["result"]))
try:
    f = open("rass1.txt", "r")
    try:
         # read all the lines into a list.
         lines = f.readlines()
    finally:
            f.close()
 
except IOError:
    pass
 
 
for line in lines:
        t = threading.Thread(target=scan, args=(line,))
        t.daemon = True
        time.sleep(0)
        t.start()
        n+=1
 
if len(bbbbb)>"0":
    try:
        logfile = open("bbbbb.txt", "a")
        try:
            for j in bbbbb:
                logfile.write(j)
        finally:
            logfile.close()
     
    except IOError:
        pass

вот немного другой вариант того же скрипта

Добавлено через 42 минуты
Цитата Сообщение от Slice_ Посмотреть сообщение
tseriess, так будет только хуже, скрипт будет кроме твоих операции работать с потоками, смотри в сторону мультипроцессорности
Добавлено через 5 минут
tseriess, так будет лучше, тем более ты сможешь пройдясь циклом проверить активны ли они и различную доп.информацию (если ты все таки остановишься на потоках)

Python
1
2
3
4
5
def main():
* * f = open("rass1.txt", "r")
* * for line in f:
* * * * threadArray.append(threading.Thread(target=scan, args=(line,)))
* * * * threadArray[-1].start()
с данным вариантом почему-то скрипт не способен обрабатывать более 4 тысяч строк, на сроках более 4 тысяч перестает писать результат в файл.

Добавлено через 3 минуты
как тут сделать еще поверку если результат вовсе не какой не получен повторить...
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 11:36  [ТС]
во всяком случае этот вариант работает

только пришлось добавить time.sleep(0.01) иначе не успевало закрывать нити
Миниатюры
Автозакрытие Thread после выполнения  
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 12:09  [ТС]
не все равно периодами пишет невозможно стартануть новый поток
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.06.2017, 13:13
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
38
39
import queue
import threading
import random
import time
 
def thread_function(work_queue):
    while True:
        try:
            value = work_queue.get()
            time.sleep(random.uniform(0.1, 2.5)) # имитация работы
            print(value)
        finally:
            work_queue.task_done()
 
 
def main():
    # "Пул" из 10 потоков
    work_queue = queue.Queue()
    threads = []
    thread_count = 10
    for t in range(thread_count):
        thread = threading.Thread(target=thread_function, args=(work_queue,), daemon=True)
        threads.append(thread)
        thread.start()
 
    # Даем задачи на растерзания потокам
    task_count = 100
    tasks = range(task_count)
    for task in tasks:
        work_queue.put(task)
 
    # Ждем завершения
    work_queue.join()
 
    print("Done!")
 
 
if __name__ == '__main__':
    main()
0
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 13:58  [ТС]
и как это применить к моему скрипту ?

Добавлено через 2 минуты
Тут как я понял у меня проблема не столь уже в поточности сейчас если использовать задержку
а в том что скрипт не успевает писать данные файл упираясь в I/O рам диска

Добавлено через 4 минуты
И как это решить не представляю, 1 раз скрипт коректно сработал и в следующий запуск с теми же данными уже пишет в файл рандомное количество записей в 3,4 раза меньше чем должно быть. И в чем проблема не понятно.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.06.2017, 14:06
Цитата Сообщение от tseriess Посмотреть сообщение
и как это применить к моему скрипту ?
Вероятно вам никто не поможет, ибо думать вы не хотите.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.06.2017, 14:06
Помогаю со студенческими работами здесь

Автозакрытие приложения после 30 минут бездействия
Здравствуйте. Подскажите пожалуйста как сделать так чтобы программа автоматически закрывалась после 30 минут бездействия.

Ожидание выполнения Thread 64+
Код рабочий, все ок. Но больше 64 потока WaitHandle не поддерживает, как ожидать выполнение 100, 200 или даже большего числа потоков? ...

Изменить горизонтальное меню - сделать автозакрытие выпадающего меню после отвода курсора
Вообщем что имеем: http://test.aowserv.ru имеется горизонтальное меню, при наведении на кнопку Пример появляется выпадающее меню. вообщем...

Дождаться выполнения Task без Thread.Sleep?
using System; public class Test { public static void Main() { Console.WriteLine("1"); var task = new...

Как использовать Thread.Sleep() для нескольких задержек выполнения кода в WPF приложении?
Как использовать Thread.Sleep() для организации нескольких задержек выполнения кода c# в WPF приложении? В WPF приложении с одним...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru