2013-04-24 24 views
23

Python'u öğrenmeye çalışıyorum ve şu anda bir tuğla duvara çarpıyorum. [Http://docs.python.org/3.3/library/threading.html#with-locks] 'dan alabildiğim kadar kitap okuyorum ama materyali anlamada sorun yaşıyorum.Basit iş parçacığı olay örneği

İki zamanlayıcıyı yan yana çalıştırmak için aldım, ancak bu iki parçanın birbiriyle nasıl etkileşimde bulunacağını anlamaya geldiğimde, kürek olmayan bir dereyi yitiriyorum. Kilitle, bir olay veya herhangi bir şey iletin.

Topluluk, basit tam örnekte, ne yaptığıyla ilgili kısa bir açıklama yaparak buraya dökülebilir.

3.3 öğrenmeye çalışıyorum, mümkünse bu sürümde çalışan kodlar gönderebilseydiniz. Bulduğum derslerin, python'un hangi sürümünün örneklendiğini bilmeme izin vermiyor.

Tekrar teşekkürler. queuedocumentation dayalı

+0

tanımla "etkileşim". Her biri farklı amaçlar için (örneğin, verileri iletme, kaynak erişimini senkronize etme, vb.) Birbirleriyle iletişim kurabilen birden çok yol vardır. – l4mpi

+0

Her türlü. Sadece birkaç örnek, böylece kafamın etrafında dolaşmaya başlayabilirim. Yapıyı görmek ve başkalarının basit kodlarını okumak yeni bir dili anlamada bana 10 kat yardımcı oluyor. – Tolure

+1

[gevent, threading, multiprocessing için çoklu üretici/tüketici örneği] (http://stackoverflow.com/a/9252020/4279) – jfs

cevap

54

Örnek:

#!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) 

Çıktı:

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

Kod için çok teşekkür ederim çok çalışıyor. – Tolure

+3

@Tolure: işte burada [benzer bir şey yapan] ['concurrent.futures'] (http://docs.python.org/3.3/library/concurrent.futures.html) analogu (http://ideone.com/ M6zPeR). – jfs

+0

hatları: 'def işçisi(): Doğru ise: item = q.get() do_work (madde) q.task_done()' bunu nasıl 'iken TRUE döngü olacak anlamaya çalışıyorum kırılmak –

İlgili konular