Şu anda üzerinde çalıştığım proje, Raspberry Pi'm ve hizmet verdiği web sitesine bağlanan istemciler arasında iletişim kurmak için Flask-SocketIO kullanıyor. Bununla birlikte, bir veya daha fazla ekstra iş parçacığı kurduğumda bir hata oluşur. Bir arka plan iş parçacığı (bu çalışır) izin vermek için bir maymun yama kullanılır. Ama belirli bir olayı ele almak için başka bir tane başlattığımda, program çöküyor. Bunlar şu anda çekirdek dosyalar şunlardır:Flask-SocketIO eventlet farklı bir iş parçacığına geçemiyor
apps.py
import eventlet
eventlet.monkey_patch()
from flask import Flask
from flask_socketio import SocketIO
app = Flask(__name__)
sio = SocketIO(app, async_mode="eventlet")
main.py
import apps
import other_module
import another_module
from threading import Thread
from flask_socketio import emit
@apps.sio.on("problematic")
def this_is_problematic(data):
Thread(target=other_module.run).start()
def updates():
while True:
apps.sio.emit("data", another_module.data())
time.sleep(.3)
if __name__ == "__main__":
Thread(target=updates).start()
apps.sio.run(apps.app, host="0.0.0.0")
other_module
sık dakika çalışabilir onun run
yöntemin yürütülmesi (boyunca tüm müşterilerine olayları yayacaktır, ama sık sık uyur), bununla ilgili bir şey olduğunu farz ediyorum. apps
modülü, aksi halde döngüsel bağımlılıkları önlemek için ayrı ayrı tanımlanmıştır. Bu other_module
, onun run
yöntemi yürütülürken alıyorum hatadır fazla ne daha azı:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/eventlet/hubs/hub.py", line 457, in fire_timers
File "/usr/local/lib/python2.7/dist-packages/eventlet/hubs/timer.py", line 58, in __call__
cb(*args, **kw)
File "/usr/local/lib/python2.7/dist-packages/eventlet/semaphore.py", line 145, in _do_acquire
waiter.switch()
error: cannot switch to a different thread
Düzenleme: farklı bir iş parçacığı benim PiCamera kullanmaya çalıştığınızda her hata oluşur gibi görünüyor. eventlet.import_patched("picamera")
'u kullanarak güvenli bir şekilde ithal etmeyi denedim, ancak herhangi bir başarıya ulaşmadan. async_mode="threading"
'a geri dönmeli miyim?
deneyin maymun yama eventlet iletişim: Bu PiCamera olmadan çalışır, o zaman şu anda en iyi seçenek ya olduğu Tüm ithalatlarınızdan önce. – Miguel
Bunu denedim, ama işe yaramadı. Sanırım başka bir iş parçacığı üreterek “diğer modül” ile ilgili bir şey olabilir (“PiCamera” nın “run” yöntemi sırasında sürekli yakalanması için). Yeni bir iş parçacığı kurmak için başka etkinliklerim var ve bunlar gayet iyi. – Y4sper
Maymun yamasının tüm uygulamada çalıştığından emin olmalısınız. Anladığım kadarıyla, düzenli ve yeşil parçacıkları karıştırırken elde ettiğiniz bu hatanın gerçekleşmesidir. – Miguel