تشغيل عمليات gevent والخادم بشكل متزامن
سؤال
كيفية تشغيل وحدة نمطية معينة نظرًا لأنني أرغب في تشغيل بعض الوظائف بشكل متزامن والتي لا تستخدم بالضرورة التوجيه (يمكن أن تكون خدمات خفية) أثناء تشغيل خادم التطبيق في نفس الوقت؟
على سبيل المثال:
#some other route functions app.post(...)
#some other concurrent functions
def alarm():
'''
Run this service every X duration
'''
ALARM = 21
try:
while 1:
#checking time and doing something. Then finding INTERVAL
gevent.sleep(INTERVAL)
except KeyboardInterrupt,e:
print 'exiting'
هل يجب علي استخدام ما سبق مثل هذا بعد ذلك رئيسي ?
gevent.joinall(gevent.spawn(alarm))
app.run(....)
أو
gevent.joinall((gevent.spawn(alarm),gevent.spawn(app.run)))
الهدف هو تشغيل هذه المنبهات مثل الخدمات الخفية، والقيام بعملها والغفوة بينما تعمل بقية عمليات الخدمة كالمعتاد.يجب أن يبدأ الخادم بشكل متزامن أيضًا.صححني إذا لم أكن على الطريق الصحيح.
المحلول
يأتي Gevent مع خوادم WSGI الخاصة به، لذلك ليس من الضروري استخدامه حقًا app.run
.الخوادم هي:
كلاهما يوفر نفس الواجهة.
يمكنك استخدام هذه لتحقيق ما تريد:
import gevent
import gevent.monkey
gevent.monkey.patch_all()
import requests
from gevent.pywsgi import WSGIServer
# app = YourBottleApp
def alarm():
'''
Run this service every X duration
'''
ALARM = 21
while 1:
#checking time and doing something. Then finding INTERVAL
gevent.sleep(INTERVAL)
if __name__ == '__main__':
http_server = WSGIServer(('', 8080), app)
srv_greenlet = gevent.spawn(http_server.serve_forever)
alarm_greenlet = gevent.spawn(alarm)
try:
gevent.joinall([srv_greenlet, alarm_greenlet])
except KeyboardInterrupt:
http_server.stop()
print 'Quitting'
لا تنتمي إلى StackOverflow