LINUX.ORG.RU

Как сделать глобальную переменную в потоках?

 


0

1

Как создать шаренную переменную между основным потоком и инициализированными?

Я что только не пытался делать, получаю NameError: name 'test_global' is not defined

import os
import urllib.request
from threading import Thread
import time
 
class DownloadThread(Thread):
    """
    Пример скачивание файла используя многопоточность
    """
    
    def __init__(self, url, name):
        """Инициализация потока"""
        Thread.__init__(self)
        self.name = name
        self.url = url         
    
    def run(self):
        """Запуск потока"""
        handle = urllib.request.urlopen(self.url)
        fname = os.path.basename(self.url)
    
        with open(fname, "wb") as f_handler:
            while True:
                chunk = handle.read(1024)
                if not chunk:
                    break
                f_handler.write(chunk)
        
        msg = "%s закончил загрузку %s!" % (self.name, self.url)
        test_global = self.name
        print(msg)
 
 
def main(urls):
    """
    Запускаем программу
    """
    global test_global
    for item, url in enumerate(urls):
        name = "Поток %s" % (item+1)        
        thread = DownloadThread(url, name)
        thread.start()
 
if __name__ == "__main__":
    urls = ["http://www.irs.gov/pub/irs-pdf/f1040.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040a.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040ez.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040es.pdf",
            "http://www.irs.gov/pub/irs-pdf/f1040sb.pdf"]         
    
 
    main(urls)

    time.sleep(10)
    
    print(test_global)
Ответ на: комментарий от steemandlinux

Вообще глобальные переменные плохая идея.

Ещё можешь свойства класса использовать в качестве глобальной переменной т.е. DownloadThread.test_global = 'foo'

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

Вообще глобальные переменные плохая идея.

А что юзать, если мне нужен постоянно работающий поток без возвратов и каких-либо теоретических гонок.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от steemandlinux

Я имею ввиду глобальные переменные вообще - дурной тон.

Чтобы качать файлы вообще потоки не нужны, есть aiohttp и т.п.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

Мне не для скачки он нужен, а для обновления информации для основного потока.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

А что юзать, если мне нужен постоянно работающий поток без возвратов и каких-либо теоретических гонок.

пуллинг вместо потоков7 Вообще для простоты считай, что любая глобальная скалярная переменная внутри потока, извне массив. А ты не указываешь индекс.

anonymous
()
Ответ на: комментарий от ei-grad

Есть сайт №1, к нему привязана вся работа программы.

Есть сайт №2, оттуда требуется только одно значение, которое требуется многим функциям потока №1

Обновлять значение с сайта №2 надо постоянно. Но я не могу вызывать параллельно или последовательно оба url сайта 1 и сайта 2, т.к. частота запросов сильно разная.

Так же надо контролировать состояние потока №2 и в случае поломки его сайта выполнять функции без значения из него, а также пытаться запустить поток №2.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

А почему get_ident не работает?

    thread = DownloadThread(url, "first")
    thread.start()
    print(thread.get_ident())
steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от pawnhearts

Нифига не понял:

threading.get_ident() Return the ‘thread identifier’ of the current thread. This is a nonzero integer. Its value has no direct meaning; it is intended as a magic cookie to be used e.g. to index a dictionary of thread-specific data. Thread identifiers may be recycled when a thread exits and another thread is created.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

Получать информацию о состоянии потока.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от Hater

Надо же нашел нужную библиотеку под эту шляпу :)

Даже треды рожать не надо.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.