2010-06-29 34 views
5

Tôi đã xem xét một chút nhưng tôi không thể giải quyết được vấn đề này. Tôi muốn thực thi một kịch bản python trong một cái nhìn của ứng dụng django của tôi. Tôi đã đặt mã tôi muốn thực hiện bên trong một lệnh quản lý django để nó có thể được truy cập thông qua dòng lệnh python manage.py command-name. Sau đó tôi đã cố gắng chạy lệnh này bằng cách sử dụng subprocess.Popen("python manage.py command-name",shell=True).Thực thi kịch bản python bằng cách sử dụng subprocess.Popen() trong chế độ xem django

Tuy nhiên, lệnh này có thể mất chút thời gian để thực thi vì vậy tôi muốn chế độ xem tiếp tục và cho phép tập lệnh thực thi trong nền. Sử dụng subprocess.Popen một mình dường như gây ra quan điểm để treo cho đến khi kịch bản đã hoàn thành, vì vậy tôi cố gắng sử dụng một sợi (sau another SA câu hỏi):

class SubprocessThread(threading.Thread): 
def __init__(self, c): 
    self.command = c 
    self.stdout = None 
    self.stderr = None 
    threading.Thread.__init__(self) 

def run(self): 
    p = subprocess.Popen(self.command, 
         shell=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

    self.stdout, self.stderr = p.communicate() 

và sau đó thực hiện nó:

t = SubprocessThread("python manage.py command-name") 
t.setDaemon(True) 
t.start() 
t.join() 

Tuy nhiên, khung nhìn vẫn bị treo: con trỏ có biểu tượng bận và AJAX trên trang không tải. Nếu không thì html của trang có vẻ như nạp tiền và các lệnh trong khung nhìn sau khi cuộc gọi thread xuất hiện để kết thúc bình thường (trước khi kịch bản kết thúc). Ai đó có thể vui lòng giúp tôi? Tôi muốn kịch bản để thực thi và làm điều riêng của mình mà không cần phải giữ chế độ xem hoặc các cuộc gọi AJAX trên trang.

+0

Tôi thường xuyên sử dụng một mẫu tương tự (với một 'quy trình con', vì' thread' bị giết khi chức năng xem thoát) và tôi thường xuyên quên trả lại thứ gì đó trong xem chức năng, khiến trình duyệt bị treo. Sau đó, tôi đổ lỗi cho các subporcess, trong khi tôi chỉ quên trả lại một 'HttpResponse'. Kiểm tra xem! – Dunatotatos

Trả lời

3

Có lẽ bạn nên sử dụng celery

Cần tây được một hàng đợi nhiệm vụ hàng đợi/công việc dựa trên thông điệp phân bố đi qua. Đó là tập trung vào hoạt động thời gian thực

1

Tôi lãng phí rất nhiều thời gian để thử triển khai một cái gì đó tương tự, nhưng có cùng vấn đề với bạn. Cuối cùng, tôi đã từ bỏ và thực hiện một hàng đợi beanstalk để xử lý công việc.

http://kr.github.com/beanstalkd/

tôi đặt một id trên hàng đợi trong giao diện Django, và sau đó có một lệnh quản lý để chạy cho người tiêu dùng (theo dõi bởi supervisord).

Sử dụng hàng đợi có nghĩa là bạn có thể mở rộng đến nhiều người tiêu dùng và cho phép quản lý tốt hơn tải (tạm dừng người tiêu dùng nếu cần mà không làm mất công việc bắt buộc).

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