2012-07-12 59 views
15

'da eşzamanlı isteği nasıl ele alır? Go'nun Google App Engine'de eşzamanlı istekleri nasıl ele aldığı konusunda biraz kafam karıştı. Bu yüzden birilerinin biraz netlik sağladığını umuyorum. İşte Go, Google App Engine

ben topladık gerçekler:

  1. Git App Engine üzerinde dişli bekar. - Git App Engine üzerinde dişli tek ise this is because it is possible to do arbitrary pointer arithmetic by creating race conditions with multiple threads

  2. Goroutines are multiplexed onto multiple OS threads so if one should block, such as while waiting for I/O, others continue to run.

  3. [App Engine has a] 10 concurrent limit [which] is enforced through a limit on concurrent threads on every runtime. Most of such cases, our scheduler will try to spin up a new instance.

sonra 3 tartışmaya açıktır etmektedir. Bu, 1 ve 2'yi bırakır. App Engine'de Git tekil iş parçacığıysa ve iş parçacıklarının G/Ç için engelleme sırasında yürütmeye devam etmesi gerekiyorsa, bir Uygulama Altyapısı Git örneği G/Ç'de beklerken tüm goroutines'i engeller.

Bu doğru mu? Değilse, Go'nun eşzamanlılığı gerçekten App Engine'de nasıl çalışır?

Bir şeyleri ölçmeye yardımcı olmak için. Bir bağlantıyı 30 saniye boyunca açık tutsaydım. Eşzamanlı bağlantılar tek bir AE Go örneği nasıl korunabilir?

Teşekkür ederiz.

DÜZENLEME: Burada Go Örneği sağlayacak özellik isteği daha sonra 10 eşzamanlı istek Allow configurable limit of concurrent requests per instance tanıtıcı var. Lütfen buna dikkat edin.

+7

GOMAXPROCS = 1'in ayarlanması (GAE'nin yaptığı şey), yalnızca her zaman tam olarak bir etkin iş parçacığı olan bir etkin iş parçacığının olacağı anlamına gelir. Hala engellenmiş birkaç parçanız olabilir (saymazlar). Ayrıca, Go kütüphanesinin arka planda epoll kullandığını, dolayısıyla I/O'nun tüm bir iş parçacığını engellemesinin olası olmadığını (ancak Go'da bir iş parçacığını engellemenin başka yolları da vardır) unutmayın. GAE genel 10 iplik sınırı hakkında bir şey bilmiyorum. – tux21b

+1

Eşzamanlı istek sınırı şimdi yapılandırılabilir (en fazla 80), bkz. Http://stackoverflow.com/a/37364981/943833 – Roganartu

cevap

21

Bir Go App Engine örneği, 10 eşzamanlı istekte bulunmasına izin verir, ancak yalnızca bir CPU iş parçacığı çalıştırır. Aslında, birden çok istek aynı anda işlenebilir, ancak bir kerede yalnızca CPU işi yapabilecek. Bir istek geri dönecek bir veri deposu API çağrısı için bekliyorsa, başka bir isteğin aynı örnek tarafından işlenmesi ücretsizdir.

"Uygulamanız tek tek App Engine'de iş parçacığıysa, o zaman 3 numaralı noktadır." yanlış. Tek bir Go App Engine örneğine hâlihazırda 10 uçuş içi talep sınırı vardır. Belgeler, "thread" hakkında konuştuğu zaman kelimelerle biraz gevşek.

+3

** Bu cevabın çok daha fazla yayılması gerekiyor. ** Go çalışma zamanı sıralarının isteklerini anladım, böylece gelen istek tam olarak işlenene kadar beklemek zorunda kalacaktı. Tek bir talebin birçok rutin işleyişini doğurabileceği ve aynı anda çalışabileceği aşikardı, ama pek çok işe gidip gelemeyeceği aşikardı. – mjibson

+0

Dokümanlar, "birden çok istek, belirli bir örnekle eşzamanlı olarak işlenebilir" diyor, ancak şu ana kadar hiç bir zaman paragraftan geçemedim, yalnızca tek bir iş parçacığı sınırlamasında durduktan sonra. – mjibson

+0

Teşekkürler David. İsteğim azaltma konusunda hala biraz belirsizim. [Takashi'nin cevabını burada aldım] (http://stackoverflow.com/a/11443482/236564), 10 eşzamanlı iş parçacığı tarafından sınırlandırılan tüm örneklerin daha sonra istekleri olduğu anlamına gelir. Bu son zamanlarda değişmiş gibi görünüyor. Go için bu doğru değil mi? Eğer gerçekten iş parçacıklarıysa, bir F1 Go örneğinin eşzamanlı taleplerinin sayısı için pratik bir sınır ne olurdu? –

4

AppEngine iç bilgisine sahip olduğumu itiraf etmeliyim. Hepsi spekülasyon ve tahmin, ama bence bu biraz mantıklı.

Uygulamanız hiçbir zaman on iş parçacığı sınırına ulaşmaz. Bunun nedeni, iş parçacığı oluşturulmasının çok az nedeni vardır. İlk olarak, bir seferde çalışan maksimum goroutines sayısı bire enforce memory safety olarak ayarlanır. İkincisi, normal bir go programından farklı olarak, uygulama motorunun aslında syscalls yapması gerekmez. Bunu yapmanın tek zamanı ağ için. Appengine'deki tüm IO bir epoll ipliğine dönüştürülebilir. Bu, ihtiyacınız olan herhangi bir zamanda iki konu olduğu anlamına gelir. Ardından, her seferinde bellek ayırma ve bağlantı kabul etme/kapama gibi diğer sistem dosyalarını çalıştırmanız gerektiğinde üçüncü veya ileri bir iş parçacığı ekleyebilirsiniz. Bunlar çok küçük bir süre için engelleyen hızlı syscalls. Bu diğer sistemlerde bile, on iplik sınırından hala çok uzaksınız.

Eşzamanlılık, etkilenmez çünkü sonuçta, appenginde yaptığınız her şey, ağ üzerinden bir şeylerin geri dönmesini beklemek zorunda kalır. Aynı anda birçok şeyi yapmak için birden fazla iş parçacığına ihtiyacınız yoktur.

+0

Teşekkür ederim Stephen çok yardımcı oldu. –

+0

@KyleFinley, "epoll şeyler" ile çok aşina değilseniz, klasik ["The C10K problemi"] ile ilgili en azından gözden geçirme konusunda tavsiye veriyorum (http://www.kegel.com/c10k.html) . – kostix

+0

Kostix İlginç yazı. Teşekkür ederim. –