2013-04-24 3 views
23

Я пытаюсь изучить питон, и сейчас я ударяю кирпичную стену. Я читаю столько, сколько могу, из [http://docs.python.org/3.3/library/threading.html#with-locks], но мне трудно понять материал.Пример простого потока событий

У меня есть два таймера, чтобы работать бок о бок, но я потерял ручей без весла, когда речь заходит о том, как заставить эти два потока взаимодействовать друг с другом. Заблокировать, передать событие или что-то еще.

Может ли сообщество просто сбросить простой полный пример здесь, с кратким описанием того, что он делает.

Я пытаюсь изучить 3.3, поэтому, если возможно, вы сможете опубликовать код, который работает для этой версии. Я также обнаружил, что учебники, которые я нахожу, не позволяют мне знать, какую версию python они рассматривают.

Еще раз спасибо.

+0

Определить "взаимодействовать". Существует несколько способов взаимодействия потоков друг с другом, для разных целей (например, передача данных, синхронизация доступа к ресурсам и т. Д.). – l4mpi

+0

Любой тип. Всего несколько примеров, чтобы я мог начать рвать мне голову. Наблюдение за структурой и чтение простых кодов других помогают мне в 10 раз понять новый язык. – Tolure

+1

[пример нескольких производителей/потребителей для gevent, многопоточность, многопроцессорность] (http://stackoverflow.com/a/9252020/4279) – jfs

ответ

54

Пример основан на queuedocumentation:

#!python3 
import threading 
from queue import Queue 
import time 

# lock to serialize console output 
lock = threading.Lock() 

def do_work(item): 
    time.sleep(.1) # pretend to do some lengthy work. 
    # Make sure the whole print completes or threads can mix up output in one line. 
    with lock: 
     print(threading.current_thread().name,item) 

# The worker thread pulls an item from the queue and processes it 
def worker(): 
    while True: 
     item = q.get() 
     do_work(item) 
     q.task_done() 

# Create the queue and thread pool. 
q = Queue() 
for i in range(4): 
    t = threading.Thread(target=worker) 
    t.daemon = True # thread dies when main thread (only non-daemon thread) exits. 
    t.start() 

# stuff work items on the queue (in this case, just a number). 
start = time.perf_counter() 
for item in range(20): 
    q.put(item) 

q.join()  # block until all tasks are done 

# "Work" took .1 seconds per task. 
# 20 tasks serially would be 2 seconds. 
# With 4 threads should be about .5 seconds (contrived because non-CPU intensive "work") 
print('time:',time.perf_counter() - start) 

Выход:

Thread-3 2 
Thread-1 0 
Thread-2 1 
Thread-4 3 
Thread-3 4 
Thread-1 5 
Thread-2 6 
Thread-4 7 
Thread-3 8 
Thread-1 9 
Thread-2 10 
Thread-4 11 
Thread-3 12 
Thread-1 13 
Thread-2 14 
Thread-4 15 
Thread-1 17 
Thread-3 16 
Thread-2 18 
Thread-4 19 
time: 0.5017914706686906 
+1

Большое спасибо за код, который отлично работает. – Tolure

+3

@Tolure: вот аналог ['concurrent.futures'] (http://docs.python.org/3.3/library/concurrent.futures.html), аналогичный тому, что [http://ideone.com/ M6zPeR). – jfs

+0

линии: определение функции работника(): в то время как True: вещь = q.get() do_work (пункт) q.task_done() ' Я пытаюсь понять, как это' в то время как true' цикл будет be break –

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