2009-03-24 23 views
8

Có bất kỳ cú pháp dựng sẵn nào trong python cho phép tôi gửi một thông điệp tới chuỗi python cụ thể bên trong vấn đề của tôi không? Giống như 'hàng đợi kết nối tín hiệu' trong pyQt hoặc :: PostMessage() trong Windows. Tôi cần điều này cho giao tiếp không đồng bộ giữa các phần của chương trình: có một số luồng xử lý các sự kiện mạng và chúng cần đăng các sự kiện này lên một luồng 'logic' đơn dịch các sự kiện một cách an toàn.Có bất kỳ sự kiện liên kết chéo nào trong python không?

Trả lời

10

Mô-đun Queue là python rất phù hợp với những gì bạn mô tả.

Bạn có thể thiết lập một hàng đợi được chia sẻ giữa tất cả các chuỗi của bạn. Các luồng xử lý các sự kiện mạng có thể sử dụng queue.put để đăng các sự kiện lên hàng đợi. Luồng logic sẽ sử dụng queue.get để lấy các sự kiện từ hàng đợi.

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

Cảm ơn! có cách nào để đặt một cuộc gọi hàm bên trong một sự kiện? Các chủ đề thực tế các chức năng gọi mã, như PostConnectionStatus (STATUS) và luồng công nhân có các trình xử lý như OnConnectionStatus (i_status). Có cách nào để tự động hóa cuộc gọi chức năng tự động với một sự kiện không? – grigoryvp

+0

Trong Python, các hàm là các đối tượng như mọi thứ khác, và do đó có thể được truyền xung quanh giống như các đối tượng khác. Vì vậy, bạn cũng có thể đính kèm một hàm để gọi với sự kiện, như q.put ((e, PostConnectionStatus)). Sau đó, chuỗi logic của bạn có thể thực hiện "e, func = q.get()". Điều này có hữu ích không? –

+0

điều chắc chắn, cảm ơn. Số biến số của các đối số có thể được marshalled cùng một cách? – grigoryvp

1

Tôi không thực sự chắc chắn những gì bạn đang tìm kiếm. Nhưng chắc chắn không có cú pháp dựng sẵn cho điều đó. Hãy xem qua các mô hình queuethreading. Có rất nhiều công cụ hữu ích như Hàng đợi, Điều kiện, Sự kiện, Khóa và Semaphores có thể được sử dụng để triển khai tất cả các loại truyền thông đồng bộ và không đồng bộ.

+0

Tôi đang tìm cách dễ dàng để gọi hàm trong một chuỗi và hàm được liên kết sẽ được gọi trong một chuỗi khác (đại biểu được xếp hàng đợi). Đồng bộ hóa nguyên thủy sẽ buộc phải làm tất cả 'bằng tay' đó là rất nhiều mã? – grigoryvp

+1

@Eye of Hell: Vui lòng đọc tài liệu mô-đun xếp hàng. Những gì dường như được gọi là một chức năng "" giữa các chủ đề thường là một hàng đợi của các yêu cầu thông qua từ một trong những chủ đề khác; chuỗi nhận được dequeues yêu cầu và gọi hàm. –

+0

ah, tôi nhớ, chức năng là đối tượng hạng nhất trong python? (các đại biểu tích hợp). Có bất kỳ cú pháp quen thuộc nào để đặt một 'cuộc gọi hàm' vào hàng đợi và thực hiện cuộc gọi thực tế trên dequeue trong chuỗi thực tế? Và những gì về đối số chức năng marshalling? – grigoryvp

Các vấn đề liên quan