2009-03-24 21 views
8

Python'da, sorunumdaki belirli bir python iş parçacığına ileti göndermemi sağlayan yerleşik bir sözdizimi var mı? Windows'da pyQt veya :: PostMessage() öğesindeki "sıralı bağlı sinyal" gibi. Program parçaları arasında eşzamansız iletişim için buna ihtiyacım var: ağ olaylarını işleyen bir dizi ileti var ve bu olayları olayları güvenli tek iş parçacığı haline çeviren tek bir 'mantık' iş parçacığına göndermeleri gerekiyor.Python'da yerleşik çapraz iş parçacıkları var mı?

cevap

10

Queue modülü python, açıkladığınız şeye çok uygundur.

Tüm iş parçacıklarınız arasında paylaşılan bir sıraya sahip olabilirsiniz. Ağ olaylarını işleyen iş parçacıkları, olayları sıraya göndermek için queue.put kullanabilir. Mantıksal iş parçacığı, sıradan olayları almak için queue.get kullanır.

import Queue 
# maxsize of 0 means that we can put an unlimited number of events 
# on the queue 
q = Queue.Queue(maxsize=0) 

def network_thread(): 
    while True: 
     e = get_network_event() 
     q.put(e) 

def logic_thread(): 
    while True: 
     # This will wait until there are events to process 
     e = q.get() 
     process_event(e) 
+0

Teşekkürler! Bir etkinliğin içinde bir işlev çağrısı koymak için herhangi bir yolu var mı? PostConnectionStatus (STATUS) gibi iş parçacığı kod çağrı işlevleri ve çalışan iş parçacığı OnConnectionStatus (i_status) gibi işleyicilere sahiptir. Bir olay ile otomatik olarak çağrıları işlevlendirmek için herhangi bir yolu var mı? – grigoryvp

+0

Python'da işlevler, diğer her şey gibi nesnelerdir ve diğer nesneler gibi etrafından geçirilebilir. Böylece, etkinlikle çağrılacak bir işlev de ekleyebilirsiniz, örneğin q.put ((e, PostConnectionStatus)). Mantıksal iş parçacığınız daha sonra "e, func = q.get()" yapabilir. Bu yardımcı olur mu? –

+0

emin şey, teşekkürler. Değişken değişken sayısı aynı şekilde sıralanabilir mi? – grigoryvp

1

Aradığınızı tam olarak emin değilim. Fakat bunun için kesinlikle yerleşik bir sözdizimi yoktur. queue ve threading modüllerine bir göz atın. Her tür eşzamanlı ve eşzamanlı olmayan iletişimi uygulamak için kullanılabilecek Kuyruklar, Koşullar, Olaylar, Kilitler ve Semaforlar gibi birçok yararlı şey var.

+0

Bir iş parçacığındaki bir işlevi çağırmanın kolay bir yolunu arıyorum ve bağlantılı bir işlev başka bir iş parçacığında (sıraya alınmış delege) çağrılır. Senkronizasyon ilkelleri, hepsini 'el ile' yapmak için zorlanacak mı? – grigoryvp

+1

@Eye of Hell: Lütfen aslında kuyruk modülü belgelerini okuyun. İş parçacıkları arasında "bir işlevi çağırmak" gibi görünen şey genellikle bir iş parçacığından diğerine geçirilen isteklerin sırasıdır; Alıcı iplik talebi reddeder ve işlevi çağırır. –

+0

ah, hatırlıyorum, işlev python'da birinci sınıf nesne midir? (yerleşik delege). Bir 'işlev çağrısı' sıraya koymak ve gerçek iş parçacığı dequeue gerçek çağrı yapmak için herhangi bir bilinen bilinen sözdizimi mi? Peki ya işlev argümanları marshalling? – grigoryvp

İlgili konular