2009-03-24 11 views
8

Czy istnieje jakakolwiek wbudowana składnia w pythonie, która pozwala mi wysłać wiadomość do określonego wątku Pythona w moim problemie? Podobnie jak "w kolejce podłączony sygnał" w pyQt lub :: PostMessage() w systemie Windows. Potrzebuję tego do asynchronicznej komunikacji między częściami programu: istnieje wiele wątków, które obsługują zdarzenia sieciowe i muszą wysyłać te zdarzenia do pojedynczego wątku "logicznego", który tłumaczy zdarzenia w sposób bezpieczny jednowątkowo.Czy istnieją jakieś wbudowane zdarzenia wątku krzyżowego w Pythona?

Odpowiedz

10

Moduł Pythona jest dobrze dopasowany do tego, co opisujesz.

Może istnieć jedna konfiguracja kolejki, która jest wspólna dla wszystkich wątków. Wątki obsługujące zdarzenia sieciowe mogą wykorzystywać kolejkę queue.put do publikowania zdarzeń w kolejce. Wątek logiczny użyłby metody queue.get do pobrania zdarzeń z kolejki.

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

Dzięki! czy jest jakikolwiek sposób na wywołanie funkcji w zdarzeniu? Rzeczywiste funkcje wywoływania kodu wątków, takie jak PostConnectionStatus (STATUS) i wątek roboczy, mają funkcje obsługi, takie jak OnConnectionStatus (i_status). Czy jest to jakaś metoda automatycznego zestawiania wywołań funkcji ze zdarzeniem? – grigoryvp

+0

W języku Python funkcje są obiektami takimi jak wszystko inne, dlatego można je przekazywać podobnie jak inne obiekty. Możesz więc dołączyć funkcję, która będzie wywoływana wraz z wydarzeniem, np. q.put ((e, PostConnectionStatus)). Wątek logiczny może wtedy wykonać "e, func = q.get()". Czy to pomaga? –

+0

pewna rzecz, dzięki. Zmienna liczba argumentów może zostać ustalona w ten sam sposób? – grigoryvp

1

Nie jestem pewien, czego szukasz. Ale na pewno nie ma wbudowanej składni do tego. Spójrz na moduły queue i . Jest wiele przydatnych rzeczy, takich jak Kolejki, Warunki, Zdarzenia, Zamki i Semafory, które mogą być używane do implementacji wszelkiego rodzaju komunikacji synchronicznej i asynchronicznej.

+0

Szukam łatwego sposobu wywoływania funkcji w jednym wątku, a funkcja połączona zostanie wywołana w innym wątku (kolejkowana delegata). Prymitywy synchronizacji wymuszą to wszystko "ręcznie", to jest dużo kodu? – grigoryvp

+1

@Eye of Hell: Proszę przeczytać dokumentację modułu kolejki. To, co wydaje się być "wywoływaniem funkcji" pomiędzy wątkami, jest zwykle kolejką żądań przekazywanych z jednego wątku do drugiego; odbierający wątek odejmuje żądanie i wywołuje funkcję. –

+0

ah, pamiętam, funkcja jest pierwszorzędnym obiektem w python? (wbudowani delegaci). Czy jest to jakaś znana składnia, aby umieścić "wywołanie funkcji" w kolejce i wykonać faktyczne wywołanie po usunięciu z kolejki w bieżącym wątku? A co z układaniem argumentów funkcji? – grigoryvp

Powiązane problemy