Форум программистов, компьютерный форум, киберфорум
Наши страницы

Python

Войти
Регистрация
Восстановить пароль
 
 
tseriess
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
#1

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

22.06.2017, 20:20. Просмотров 589. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2017, 20:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Автозакрытие Thread после выполнения (Python):

Задержка окна консоли после выполнения кода - Python
Есть код, который использует модули os, subprocess, вызывает cmd и пытается авторизоваться в сетевой папке с помощью системных команд...

Продолжение выполнения цикла после нажатия клавиши - Python
Имеется двумерный list, пример: , , ], в котором заключены введёные пользователем данные. Необходимо составить схему (точнее, list с...

Как сделать задержку экрана после выполнения кода? - Python
Как сделать задержку экрана после выполнения кода? В обычной idle с помощью создания файла idle, аналог в C# readkey();&

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

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

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

28
tseriess
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 11:36  [ТС] #16
во всяком случае этот вариант работает

только пришлось добавить time.sleep(0.01) иначе не успевало закрывать нити
0
Миниатюры
Автозакрытие Thread после выполнения  
tseriess
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 12:09  [ТС] #17
не все равно периодами пишет невозможно стартануть новый поток
0
Avazart
Эксперт С++
7417 / 5507 / 316
Регистрация: 10.12.2010
Сообщений: 24,607
Записей в блоге: 17
24.06.2017, 13:13 #18
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
tseriess
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 13:58  [ТС] #19
и как это применить к моему скрипту ?

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

Добавлено через 4 минуты
И как это решить не представляю, 1 раз скрипт коректно сработал и в следующий запуск с теми же данными уже пишет в файл рандомное количество записей в 3,4 раза меньше чем должно быть. И в чем проблема не понятно.
0
Avazart
Эксперт С++
7417 / 5507 / 316
Регистрация: 10.12.2010
Сообщений: 24,607
Записей в блоге: 17
24.06.2017, 14:06 #20
Цитата Сообщение от tseriess Посмотреть сообщение
и как это применить к моему скрипту ?
Вероятно вам никто не поможет, ибо думать вы не хотите.
0
tseriess
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 14:12  [ТС] #21
Что касательно I/O у питона искусственное ограничение на возможность писать в файл ?
По другому не представляю как объяснить эту упоротость причем что сам питон что скрипт что файл который читает и пишется на рам диске.

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Вероятно вам никто не поможет, ибо думать вы не хотите.
Нет просто вы невнимательно прочитали вопрос и даете абсолютно не применимое решение.
Каким образом ваш костил аля индус код чем больше строк - тем лучше решит проблему с тем что скрипт то пишет все данные файл то почему то только часть?

Добавлено через 46 секунд
Зачем там ваще рандом ? абы был ?
0
Avazart
Эксперт С++
7417 / 5507 / 316
Регистрация: 10.12.2010
Сообщений: 24,607
Записей в блоге: 17
24.06.2017, 14:13 #22
Цитата Сообщение от tseriess Посмотреть сообщение
Что касательно I/O у питона искусственное ограничение на возможность писать в файл ?
Один файл - один поток.
Открывать один файл для записи с нескольких потоков не выйдет.
del
0
tseriess
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 14:39  [ТС] #23
Цитата Сообщение от Avazart Посмотреть сообщение
Один файл - один поток.
Открывать один файл для записи с нескольких потоков не выйдет.
Но почему тогда пару запусков корректно записывают а потом начинают непонятки ?
Кто муже там чтение в много потоков ити должно. Почему такой бред творится которого быть не должно
Зачем мне 100500 проверок потоков, это должно решатся парой строчек кода. Это не си где надо городить километры кода для простого действия.

Решение с потоками мне уже подсказали, и оно работает и там всего 2 строчки кода . Но проблема в том что творится какая-то мистическая хрень с записью в файл.

Добавлено через 9 минут
вот к примеру исправленный код с мистическими проблемами с записью в файл

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
import urllib2
import time
import json
import threading
threadArray =[]
 
balances = open("ddddd.txt", "a")
def scan(address):
    urlRequest = urllib2.Request("https://api.etherscan.io/api?module=account&action=balance&address=" + address)
    data = urllib2.urlopen(urlRequest).read()
    json_data = json.loads(data)
    if json_data["result"]>"0":
            balances.write("Balance of " + address + " is " + str(json_data["result"]) + "\n")
    print ("Balance of " + address + " is " + str(json_data["result"]) + "\n")
 
def main():
    f = open("rass1.txt", "r")
    for line in f:
        threadArray.append(threading.Thread(target=scan, args=(line,)))
        threadArray[-1].start()
        time.sleep(0.01)
    
if __name__ == '__main__':
    main()

То все как надо пишет, то его кондратий берет все проверит но в файл половину записей не запишет


вот данные на вход подаваемые

Код
0xEfC1b869c7E2daf9095A1AD2Bc332F9aAb6660aF
0xEfC1b869c7E2daf9095A1AD2Bc332F9aAb6660aF
0xEfC1b869c7E2daf9095A1AD2Bc332F9aAb6660aF
в моем варианте продублированные 8000 раз для проверки корректности. На выходе должно получается 16 тысяч строк в файле. Пару раз он сработал коректно, последующие запуски не дают более той коректности записи, а часть данных пишут, часть куда-то местническим образом уходит. Хотя приведущий запуск все верно сделал.

слип поставил так как была мысль что в этом проблема, но нет хоть 0.1 задержку ставить все равно начинает "тупить" И потоков вроде открыто приемлемо.

Добавлено через 12 минут
Я извиняюсь за свою неадекватность, уже сутки с этим пытаюсь что то сделать. И как удается одну проблему решить вылазит другая.

И также я прямо пишу что не понимаю как применить показанный пример к моему коду.
0
Avazart
Эксперт С++
7417 / 5507 / 316
Регистрация: 10.12.2010
Сообщений: 24,607
Записей в блоге: 17
24.06.2017, 15:05 #24
Цитата Сообщение от tseriess Посмотреть сообщение
Вот вам ссылка на документацию питона и не задавайте глупых вопросов, я все знаю и мне норм"
Кстати пример на основе кода из книги Самерфилда "Программирование на Python3" страница 477
0
magirus
24.06.2017, 15:07
  #25
 Комментарий модератора 
настоятельно прошу воздержаться от переходов на личности
0
tseriess
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 15:40  [ТС] #26
Цитата Сообщение от Avazart Посмотреть сообщение
Кстати пример на основе кода из книги Самерфилда "Программирование на Python3" страница 477
У писал что питон 2.7.13, с большой вероятностью это не годится. Если уж приводили пример то привели бы уже с чтением строк из файла пример.
Так как там поточность то в основном для чтения из файла и используется.

Добавлено через 18 минут
Как я сюда
Python
1
2
3
def main():
    f = open("rass1.txt", "r")
    for line in f:
применю

Python
1
for t in range(thread_count):
0
Avazart
Эксперт С++
7417 / 5507 / 316
Регистрация: 10.12.2010
Сообщений: 24,607
Записей в блоге: 17
24.06.2017, 15:45 #27
Что стоит заменить

Python
1
2
3
4
    task_count = 100
    tasks = range(task_count)
    for task in tasks:
        work_queue.put(task)
На
Python
1
2
3
    f = open("rass1.txt", "r")
    for line in f:
       work_queue.put(line)
А time.sleep() ваш код работы с сетью и записью в файл.
И как я сказал файл у каждого потока должен быть разный.
0
tseriess
0 / 0 / 0
Регистрация: 30.08.2015
Сообщений: 92
24.06.2017, 20:28  [ТС] #28
Цитата Сообщение от Avazart Посмотреть сообщение
И как я сказал файл у каждого потока должен быть разный.
вот тут не понял, как это файл у каждого потока должен быть разным ? Ведь задача читать с одного файла данные и писать в 1 файла, и лишь парсить в многопоточном режиме. По моему это бред какой-то выходит, если каждому потококу надо отдельно файл создавать.

Какой смысл в многопоточности тогда если надо для каждого потока по файлу создавать? ) если легче уже запустить несколько копий программы с разными файлами.

Ведь в стандартной ( кривой реализации ) он же читает потоками строчки отлично, только как вы писали gc потоки прибивает до их выполнения и прибиваются судя по всему те что на запись в файл)

Добавлено через 14 минут
Python
1
2
    import queue
ImportError: No module named queue
Он не ставится на питоне 2.7.13

Добавлено через 2 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
g:\>easy_install-2.7 queue
Searching for queue
Reading [url]https://pypi.python.org/simple/queue/[/url]
No local packages or working download links found for queue
error: Could not find suitable distribution for Requirement.parse('queue')
 
g:\>pip2.7 install queue
Collecting queue
  Could not find a version that satisfies the requirement queue (from versions:
)
No matching distribution found for queue
Добавлено через 5 минут
В питоне 2 оказывается import Queue , в любом случае как это исправить удалось посыпались другие ошибки. Код для 3 питона и для 2 не годится (

Добавлено через 4 часа 7 минут
Уже головой об стену готов биться, не уж то для питона 2.7 не существует решения ? Или до меня настолько не доходит :/
0
alex925
2594 / 2245 / 536
Регистрация: 19.03.2012
Сообщений: 8,744
25.06.2017, 17:37 #29
Цитата Сообщение от tseriess Посмотреть сообщение
Уже головой об стену готов биться, не уж то для питона 2.7 не существует решения ?
Существуют и тебе о них сказали уже.
Цитата Сообщение от tseriess Посмотреть сообщение
Он не ставится на питоне 2.7.13
queue это модуль стандартной библиотеки, его не надо ставить отдельно ни на какой версии python.

Не по теме:


Цитата Сообщение от tseriess Посмотреть сообщение
для питона 2.7
Это древнеисторическая версия, ей не пользуются сейчас.

0
25.06.2017, 17:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2017, 17:37
Привет! Вот еще темы с ответами:

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

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

Действия после Thread.Abort() - C#
Как можно заставить поток выполнить некоторые действия после того как он получить команду Abort()? Или же как завершать поток чтобы...

.NET 4.x очистка данных Thread после завершения - Visual Basic .NET
на форме кнопка Button1 есть лист, куда добавляю потоки Dim t As New List(Of Thread) событие нажатия кнопки: Private Sub...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru