2013-06-18 41 views
5

Trong một dự án tôi đang làm việc tại một dịch vụ Tornado với Behave vì vậy tôi muốn bắt đầu một vụ dịch vụ lốc xoáy của tôi trước khi chạy từng kịch bản.Làm thế nào để chạy Tornado IO Loop trong khi thiết lập môi trường Behave

ngây thơ cố gắng chạy vòng lặp như một phần trước khi tất cả dường như khóa excecution:

from tornado import ioloop 
from tornadoadapter.applications import APPLICATION 


def before_all(context): 
    print "Service running on port 8000" 
    APPLICATION.listen(8000) 
    ioloop.IOLoop.instance().start() 

Vì vậy, nó có lẽ không phải những gì tôi cần.

Trả lời

3

IOLoop của bạn đang chạy trong chuỗi chính, vì vậy nó đang chặn. Bạn có thể làm điều đó trong một chủ đề hoặc quy trình riêng biệt.

from multiprocessing import Process 

from tornado import ioloop 
from tornadoadapter.applications import APPLICATION 


def run_server(): 
    print "Service running on port 8000" 
    APPLICATION.listen(8000) 
    ioloop.IOLoop.instance().start() 


def before_all(context): 
    context.server_thread = Process(target=run_server) 
    context.server_thread.deamon = True 
    context.server_thread.start() 
+0

Khi tôi cố gắng chạy trên Windows, tôi nhận được ngoại lệ sau đây: 'pickle.PicklingError: Không thể dưa :. Nó không tìm thấy như __main __ run_server' –

+0

âm thanh như bạn ' Hàm run_server' không thể chọn được. điều nhanh chóng để kiểm tra là nếu bạn thực sự có thể nhập 'run_server'? tức là nếu đó là một lambda hoặc một hàm bên trong 'before_all' thì nó sẽ không hoạt động. – Xuan

+0

'run_server' được định nghĩa giống như trong mẫu mã của bạn; nó nằm trong cùng một tệp, ngay trước khi 'before_all' được định nghĩa. –

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