2013-04-24 14 views
23

Próbuję nauczyć się Pythona, a teraz uderzam w ceglaną ścianę. Czytam jak najwięcej z [http://docs.python.org/3.3/library/threading.html#withlocks], ale mam problem ze zrozumieniem materiału.Przykładowy wątek prosty

Dostałem dwa timery do biegania obok siebie, ale jestem zagubiony w potoku bez wiosła, jeśli chodzi o zastanowienie się, jak sprawić, aby te dwa wątki wchodziły ze sobą w interakcje. Zablokuj, zdaj wydarzenie lub cokolwiek.

Społeczność może po prostu zrzucić prosty pełny przykład z krótkim opisem tego, co robi.

Próbuję nauczyć się 3.3, więc jeśli to możliwe, będziesz mógł umieścić kod, który działa dla tej wersji. Odkrywam też, że tutoriale, które znajduję, nie pozwalają mi sprawdzić, jakiej wersji python próbują.

Jeszcze raz dziękuję.

+0

Zdefiniuj "interakcji". Istnieje wiele sposobów, w jakie wątki mogą się ze sobą komunikować, każdy w różnych celach (np. Przekazywanie danych, synchronizowanie dostępu do zasobów itp.). – l4mpi

+0

Dowolny typ. Oto kilka przykładów, dzięki którym mogę zacząć rapować po głowie. Oglądanie struktury i czytanie prostych kodów innych pomaga mi 10 razy lepiej zrozumieć nowy język. – Tolure

+1

[wielu producentów/użytkowników przykładowych dla gevent, threading, multiprocessing] (http://stackoverflow.com/a/9252020/4279) – jfs

Odpowiedz

54

Przykład na podstawie 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) 

wyjściowa:

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

Dziękuję bardzo za kod, który działa świetnie. – Tolure

+3

@Tolure: tutaj jest analog [[concurrent.futures'] (http://docs.python.org/3.3/library/concurrent.futures.html), który [robi coś podobnego] (http://ideone.com/ M6zPeR). – jfs

+0

Linie: 'pracownik def(): podczas Prawda: item = q.get() do_work (pozycja) q.task_done()' Próbuję zrozumieć, jak to 'while true' będzie be break –

Powiązane problemy