2013-09-24 42 views
13

Aynalı geri çağrıları .NET Remoting'den yöneten bir Python komut dosyası var. Bu geri çağrılar bir dummy (worker) iş parçacığında yürütülür. Geri arama işleyicimin içinden, komut dosyasımda tanımladığım bir işlevi çağırmam gerekiyor, ancak ana iş parçacığı yürütme işlevine ihtiyacım var.Python işlevini yürütme Ana iş parçacığında Kukla iş parçacığı içinde yürütme Kukla iş parçacığı

Ana iş parçacığı, bir sunucuya komut gönderen uzak bir istemcidir. Bu komutlardan bazıları senkronize olmayan geri aramalarla sonuçlanır.

Temel olarak, .NET'in Invoke yönteminin eşdeğerine ihtiyacım var. Mümkün mü?

+0

ana iş parçacığı ne yapar? Bunu bir şekilde işaretlemeniz ve fonksiyonu çağırması gerekiyor. Ana iş parçacığı genellikle olayların gerçekleşmesini beklerse, bunu işaretleyin. Ana iş parçacığı işliyorsa, sıraya çağrılacak işlevi koyun ve ana iş parçacığının sıraya göre sıraya girip işlenmesini sağlayın. – Claudiu

+0

Eklemek bilgi eklendi. –

+0

Hmmm ... daha fazla düşünün .... Main, sunucunun bir aramayı kontrol etmesini beklerken geri arama gerçekleşirse, Main'in başka bir şey yapmasına imkan yok, değil mi? –

cevap

18

Kukla iş parçacığınızın işlevleri ile doldurduğu ve ana iş parçacığının tükettiği bir kuyruğu ayarlamak için Queue sınıfını kullanmak istersiniz.

import Queue 

#somewhere accessible to both: 
callback_queue = Queue.Queue() 

def from_dummy_thread(func_to_call_from_main_thread): 
    callback_queue.put(func_to_call_from_main_thread) 

def from_main_thread_blocking(): 
    callback = callback_queue.get() #blocks until an item is available 
    callback() 

def from_main_thread_nonblocking(): 
    while True: 
     try: 
      callback = callback_queue.get(False) #doesn't block 
     except Queue.Empty: #raised when queue is empty 
      break 
     callback() 

Demo:

import threading 
import time 

def print_num(dummyid, n): 
    print "From %s: %d" % (dummyid, n) 
def dummy_run(dummyid): 
    for i in xrange(5): 
     from_dummy_thread(lambda: print_num(dummyid, i)) 
     time.sleep(0.5) 

threading.Thread(target=dummy_run, args=("a",)).start() 
threading.Thread(target=dummy_run, args=("b",)).start() 

while True: 
    from_main_thread_blocking() 

Baskılar:

From a: 0 
From b: 0 
From a: 1 
From b: 1 
From b: 2 
From a: 2 
From b: 3 
From a: 3 
From b: 4 
From a: 4 

ve sonra bloklar sonsuza

+0

Çok havalı. Python, temsilci geçişi ve depolamayı önemsiz kılar. Çok detaylı cevabınızı takdir ediyorum. –

+0

@JimC: bu benim favori dilimin neden bir parçası =). şerefe – Claudiu

İlgili konular