2016-04-03 15 views
1

Ş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?

+0

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

+0

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

+0

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

cevap

0

Sorunu yalıtın.

  • zaman uyumsuz modu = ayrı bir işlemde
  • PiCamera dizisi oluşturma ve ana dosyadaki soketleri vasıtasıyla
+0

Bunu deneyeceğim, ancak performanstaki olası kazancın artan karmaşıklığını geçmeyeceğini düşünüyorum. Async-mode = "threading" 'ye geri dönebilirim ve basit bir şekilde ele alabilirim. – Y4sper

+0

İş parçacığı performansıdır. Ayrı işlem, sorunların çözümü için bir çözümdür. – temoto

+0

Ben “eventlet” kullanmaya devam edememe performansındaki kazanım demek istedim, ama async-mode = “threading” 'e geri dönmek gibi görünüyor. – Y4sper

İlgili konular