2013-03-17 3 views
2

Использование Python 2.7.3 в Windows.Как распределить переменную между 2 потоками

Как можно разделить переменную num между потоками, чтобы после num был квадрат, он печатается?

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

Мой код (продолжает печать 2)

import threading 
def func1(num): 
    while num < 100000000: 
     num = num**2 
def func2(num): 
    while num < 100000000: 
     print num, 
num = 2 
thread1 = threading.Thread(target=func1,args=(num,)) 
thread2 = threading.Thread(target=func2,args=(num,)) 
print 'setup' 
thread1.start() 
thread2.start() 

ответ

9

Общий ответ на этот вопрос очередей:

import threading, Queue 

def func1(num, q): 
    while num < 100000000: 
     num = num**2 
     q.put(num) 

def func2(num, q): 
    while num < 100000000: 
     num = q.get() 
     print num, 

num = 2 
q = Queue.Queue() 
thread1 = threading.Thread(target=func1,args=(num,q)) 
thread2 = threading.Thread(target=func2,args=(num,q)) 
print 'setup' 
thread1.start() 
thread2.start() 

печати

=== [email protected]:~/StackOverflow:507 > ./tst.py 
setup 
4 16 256 65536 4294967296 

Обратите внимание, чем в этом (и ваши) code, num - локальная переменная как в func1, так и в func2, и они не имеют отношения к eac h, за исключением того, что они получают начальное значение глобальной переменной num. Так что num не поделился здесь. Скорее, один поток помещает значение его num в очередь, а другой связывает это значение с локальной (и, следовательно, другой) переменной с тем же именем. Но, конечно, это могло бы использовать любое имя.

+0

Итак, очередь - это механизм связи между двумя потоками. Кроме того, очередь может содержать любую структуру данных, правильно? – pradyunsg

+0

Да, очередь - это потокобезопасный способ связи. Он может содержать любые данные, списки, dicts, даже Exceptions (которые могут быть полезны для отправки обратно в основной процесс). – uselpa

+0

Спасибо за очищение моего сомнения. Небольшой вопрос (до того, как я перевежу). У меня может быть любое количество очередей (как ограничено по мощности обработки). Я прав? – pradyunsg

Смежные вопросы