Найти - Пользователи
Полная версия: как поиметь локальную память потока?
Начало » Python для новичков » как поиметь локальную память потока?
1
o7412369815963
# 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 нельзя передавать параметры, и глобальный массив не желательно, охота штатный механизм.
bw
> но он видимо создает новый экземпляр на каждый вызов
Ну сделай один вызов :-). И используй получившийся единственный глобальный экземпляр.

..bw
Ed
У меня получилось так:
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)
o7412369815963
currentThread() - то что надо, спасибо
o7412369815963
…хотя это та же самая глобальная переменная (словарь)
Ed
Не понял чего вы хотите, честно говоря. Получить объект треда из воздуха, что ли? Естественно где-нибудь они присутствуют в некоем отдельном месте. Сегодня в глобальном словаре, завтра еще где-то. Это уже детали реализации threading API, до которых вам не должно быть дела.
Андрей Светлов
“официальный” способ такой
storage = threading.local()
storage.x = None

def a():
print storage.x

def b():
storage.x = 123
o7412369815963
Андрей Светлов
“официальный” способ такой
а… его единожды нужно вызывать, при старте приложения.
# 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)
Спасибо
Андрей Светлов
Пожалуйста.
И, прошу, никогда не используйте модуль thread. Не нужно…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB