2013-04-24 20 views
23

Sto cercando di imparare Python e sto colpendo un muro di mattoni in questo momento. Sto leggendo il più possibile da [http://docs.python.org/3.3/library/threading.html#with-locks] ma ho difficoltà a capire il materiale.Esempio di threading semplice esempio

Ho due timers per correre fianco a fianco ma mi sento perso su un torrente senza paddle quando si tratta di capire come far interagire questi due thread l'uno con l'altro. Blocca, passa un evento o altro.

È possibile che la comunità esegua semplicemente un semplice esempio completo con una breve descrizione di ciò che fa.

Sto cercando di imparare 3.3 quindi, se possibile, si sarebbe in grado di pubblicare il codice che funziona per questa versione. Sto anche scoprendo che le esercitazioni che trovo non mi permettono di sapere quale versione di Python stanno campionando.

Grazie ancora.

+0

Definire "interagiscono". Esistono diversi modi in cui i thread possono comunicare tra loro, ciascuno per scopi diversi (ad esempio, trasmissione di dati, sincronizzazione dell'accesso alle risorse, ecc.). – l4mpi

+0

Qualsiasi tipo. Solo alcuni esempi in modo che io possa iniziare a picchiarmi sopra. Vedere la struttura e leggere semplici codici di altri mi aiuta 10 volte a comprendere una nuova lingua. – Tolure

+1

[esempio di più produttori/consumatori per gevent, threading, multiprocessing] (http://stackoverflow.com/a/9252020/4279) – jfs

risposta

54

Esempio per 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) 

uscita:

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

Grazie mille per il codice funziona benissimo. – Tolure

+3

@Tolure: ecco un ['concurrent.futures'] (http://docs.python.org/3.3/library/concurrent.futures.html) analogico che [fa una cosa simile] (http://ideone.com/ M6zPeR). – jfs

+0

Le linee: 'lavoratore def(): while True: item = q.get() do_work (voce) q.task_done()' Sto cercando di capire come questo 'true' mentre loop be break –