Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2010 13:56:57

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

как поиметь локальную память потока?

# coding:utf8

import thread
import threading
import time
from random import randint

g_loop = True

def foo():
local = threading.local()
print local.A

def myThread():
local = threading.local()
local.A = randint(0,100)
while g_loop:
foo()
time.sleep(0.4)

thread.start_new_thread(myThread, tuple([]))
thread.start_new_thread(myThread, tuple([]))
raw_input('')
g_loop = False
time.sleep(1)
смысл такой: при выполнении ф-ии foo нужно что-б были доступны одни и те ж переменные в пределах потока.

как можно такое реализоват? думал threading.local() даст необходимое, но он видимо создает новый экземпляр на каждый вызов.

ЗЫ: в переменную foo нельзя передавать параметры, и глобальный массив не желательно, охота штатный механизм.

Отредактировано (Окт. 7, 2010 14:00:20)

Офлайн

#2 Окт. 7, 2010 15:31:39

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

как поиметь локальную память потока?

> но он видимо создает новый экземпляр на каждый вызов
Ну сделай один вызов :-). И используй получившийся единственный глобальный экземпляр.

..bw



Офлайн

#3 Окт. 7, 2010 15:32:20

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

как поиметь локальную память потока?

У меня получилось так:

from threading import Thread, currentThread
import time

g_loop = True

def foo():
print currentThread().tag

class myThread(Thread):
def __init__(self, tag, timeout):
Thread.__init__(self)
self.tag = tag
self.timeout = timeout

def run(self):
while g_loop:
foo()
time.sleep(timeout)

for tag, timeout in [('tag1', 1), ('tag2', 0.5)]:
myThread(tag, timeout).start()

time.sleep(10)
g_loop = False
time.sleep(1)



Отредактировано (Окт. 7, 2010 15:33:00)

Офлайн

#4 Окт. 7, 2010 15:42:24

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

как поиметь локальную память потока?

currentThread() - то что надо, спасибо

Офлайн

#5 Окт. 7, 2010 15:45:03

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

как поиметь локальную память потока?

…хотя это та же самая глобальная переменная (словарь)

Офлайн

#6 Окт. 7, 2010 16:58:58

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

как поиметь локальную память потока?

Не понял чего вы хотите, честно говоря. Получить объект треда из воздуха, что ли? Естественно где-нибудь они присутствуют в некоем отдельном месте. Сегодня в глобальном словаре, завтра еще где-то. Это уже детали реализации threading API, до которых вам не должно быть дела.



Отредактировано (Окт. 7, 2010 17:19:55)

Офлайн

#7 Окт. 7, 2010 18:12:48

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

как поиметь локальную память потока?

“официальный” способ такой

storage = threading.local()
storage.x = None

def a():
print storage.x

def b():
storage.x = 123



Офлайн

#8 Окт. 8, 2010 01:21:03

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

как поиметь локальную память потока?

Андрей Светлов
“официальный” способ такой
а… его единожды нужно вызывать, при старте приложения.
# coding:utf8

import thread
import threading
import time
from random import randint

stor = threading.local()

def foo():
print stor.A

def myThread():
stor.A = randint(0,100)
for x in xrange(10):
foo()
time.sleep(0.4)

thread.start_new_thread(myThread, tuple([]))
thread.start_new_thread(myThread, tuple([]))
thread.start_new_thread(myThread, tuple([]))
time.sleep(5)
Спасибо

Офлайн

#9 Окт. 8, 2010 04:10:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

как поиметь локальную память потока?

Пожалуйста.
И, прошу, никогда не используйте модуль thread. Не нужно…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version