Bạn có thể tạo chuỗi nền từ tập lệnh WSGI khi nó được nhập lần đầu tiên.
import threading
import time
def do_stuff():
time.sleep(60)
... do periodic job
_thread = threading.Thread(target=do_stuff)
_thread.setDaemon(True)
_thread.start()
Để làm việc này, bạn sẽ chỉ phải sử dụng một quy trình daemon nếu không, quy trình sẽ thực hiện tương tự như bạn không muốn.
Nếu bạn đang sử dụng nhiều quy trình trong nhóm quy trình daemon, một cách khác là tạo nhóm quy trình daemon đặc biệt mà mục đích duy nhất là chạy chuỗi nền này. Nói cách khác, quá trình này không thực sự nhận được bất kỳ yêu cầu nào.
Bạn có thể làm điều này bằng cách:
WSGIDaemonProcess django-jobs processes=1 threads=1
WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \
process-group=django-jobs application-group=%{GLOBAL}
Chỉ thị WSGIImportScript nói để tải kịch bản đó và chạy nó khi khởi động trong bối cảnh các nhóm quá trình 'django-việc làm'.
Để lưu nhiều tập lệnh, tôi đã chỉ rõ nó là tệp kịch bản WSGI ban đầu của bạn mà bạn đã sử dụng cho WSGIScriptAlias. Chúng tôi không muốn nó chạy khi nó được nạp bởi chỉ thị rằng mặc dù, vì vậy chúng tôi làm:
import mod_wsgi
if mod_wsgi.process_group == 'django-jobs':
_thread = threading.Thread(target=do_stuff)
_thread.setDaemon(True)
_thread.start()
Ở đây nó nhìn vào tên của nhóm quá trình daemon và chỉ chạy khi bắt đầu lên trong quá trình daemon đặc biệt nhóm được thiết lập chỉ với một quy trình duy nhất cho việc này.
Nhìn chung, bạn chỉ đang sử dụng Apache như một trình quản lý quy trình tráng lớn, mặc dù đã được biết là mạnh mẽ. Đó là một chút quá mức cần thiết khi quá trình này sẽ tiêu thụ bộ nhớ bổ sung trên đầu trang của những chấp nhận và xử lý yêu cầu, nhưng tùy thuộc vào sự phức tạp của những gì bạn đang làm nó vẫn có thể hữu ích. Một khía cạnh dễ thương của việc này là vì nó vẫn là một ứng dụng Django đầy đủ trong đó, bạn có thể ánh xạ các URL cụ thể cho quá trình này và cung cấp một API từ xa để quản lý hoặc theo dõi nhiệm vụ nền và những gì nó đang làm .
WSGIDaemonProcess django-jobs processes=1 threads=1
WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \
process-group=django-jobs application-group=%{GLOBAL}
WSGIDaemonProcess django-site processes=4 threads=5
WSGIScriptAlias//usr/local/django/mysite/apache/django.wsgi
WSGIProcessGroup django-site
WSGIApplicationGroup %{GLOBAL}
<Location /admin>
WSGIProcessGroup django-jobs
</Location>
Ở đây, tất cả URL ngoại trừ nội dung trong/quản trị chạy trong 'django-site', với/admin trong 'django-jobs'.
Dù sao, điều đó giải quyết câu hỏi cụ thể về việc thực hiện nó trong quy trình Apache mod_wsgi daemon theo yêu cầu.
Như đã chỉ ra, cách khác là có tập lệnh dòng lệnh thiết lập và tải Django và thực hiện công việc và thực hiện tác vụ đó từ công việc định kỳ.Một kịch bản dòng lệnh có nghĩa là sử dụng bộ nhớ tạm thời không thường xuyên, nhưng chi phí khởi động cho công việc cao hơn khi cần tải mọi thứ mỗi lần.
Tôi đã đi với Celery. Làm việc như người ở. –
tác vụ cron không liên tục chạy trong nền, nhưng bắt đầu tại một thời điểm nhất định và kết thúc khi sẵn sàng. Kể từ khi lệnh django mất abut 1,5 giây để bắt đầu (depening trên sự phức tạp của các mô hình), điều này thường không phải là cách để làm điều đó khi hiệu suất cao là cần thiết. – FeedTheWeb
Điều này vẫn hợp lệ? Nếu có, điều gì sẽ là một cách tốt để thực hiện nhiệm vụ Celery để xử lý lâu dài của tôi? –