2010-11-10 32 views
9

Şimdi bazı kodların yazıldığını yazıyorum (Python'u gevent kullanarak) ve nginx'i bir web sunucusu olarak kullanıyorum ve ikisinin de harika olduğunu hissediyorum. Olaylarla uğraştığım, ancak göremediğim söylendi. Birisi biraz ışık tutabilir mi?Neden async kullanmamalıyım (olayım) IO

James

+0

Neden * yapmamalı? (Sizin için ya da aleyhinde hiçbir argüman sağlamamışsınızdır.) –

+0

Aktarımın ne olduğunu bilmek istiyorum ... – James

+0

önbellek tutarlılığı? kod karmaşıklığı? iplik kullanımı? –

cevap

1

büyük sorun iş parçacığı olmadan, bir müşteri için bir blok tüm müşteri için bir blok neden olacaktır. Örneğin, bir istemci, işletim sisteminin istek sürecini engellemesini gerektiren bir kaynak isterse (diskte, disk belleğinde dosya vb.) Bir kaynak isterse, tüm istemciler beklemek zorunda kalacaktır. Çok iş parçacıklı bir sunucu, yalnızca bir istemciyi engelleyebilir ve başkalarına hizmet vermeye devam edebilir.

Yukarıdaki senaryo olası değilse (yani, tüm istemciler aynı kaynakları isteyecektir), o zaman olay güdümlü yol gitmek olduğunu söyledi.

+7

Hiç bahsetmediğiniz şey, ihtiyacınız olan kaynağa, engelleme olmayan bir şekilde erişebilmenizdir. Bu şekilde engellemezsiniz, müşterileri yanıtlamaya devam edebilir ve kaynak hazır olduğunda, tek bir iş parçacığında etkinlik sisteminizden bir geri arama alır. – nosklo

+1

ikincisi - olay tabanlı kod fikri her şey için eşzamansız arabirimler kullanmaktır: eşzamanlı I/O yok. python ile gevent, twisted, vb bile olsa dikkatli değilseniz yanlışlıkla bazı çağrı engelleme kullanımı oldukça kolaydır. btw, iş parçacığı vs. olayları hakkında konuştuğunuz sayfa budur: http://www.kegel.com/c10k.html – cce

+2

@cce: c10k yeterli değilse c500k'yi deneyebiliriz: http: //blog.urbanairship .com/blog/2010/09/29/linux-kernel ayar-için-c500k / – jfs

9

Olaylı programlamanın tek zorluğu, hiç engellememenizdir. Bu, iş parçacığı göz önünde bulundurularak tasarlanmış bazı kitaplıkları kullanırsanız, elde etmek zor olabilir. Bu kütüphaneleri kontrol etmezseniz, fork() + message ipc gitmek için yoldur.