2015-03-24 14 views
5

Web sunucusu modülüyle PhantomJS'yi eşzamanlı isteklerle çok iş parçacıklı bir şekilde kullanmayla ilgili bir sorun yaşıyorum.
here (ve here kodlu) açıklandığı gibi, sunucu tarafında yüksek stok grafikler oluşturmak için PhantomJS 2.0 kullanıyorum. İyi çalışıyor ve çeşitli boyutlardaki grafikleri test ederken, bir grafik oluşturmak için yaklaşık 0,4 saniyede oldukça tutarlı sonuçlar elde ettim.Yerleşik web sunucusuna sahip PhantomJS yalnızca bir CPU kullanıyor

Bağladığım kod, başlangıçta highcharts ekibi tarafından yayımlandı ve ayrıca, http://export.highcharts.com/ adresindeki dışa aktarma sunucularında da kullanılıyor. Eşzamanlı istekleri destekleyebilmek için, bir dizi PhantomJS işleminin havuzunu tutar ve temel olarak modeli eşzamanlı istek başına bir phantoms örneğidir.

Web sunucusu modülünün en fazla 10 eşzamanlı isteği desteklediğini gördüm (burada açıklanmıştır), bu yüzden havuzumda daha az sayıda PhantomJS işleminin devam ettirilebileceğini düşündüm. Ancak, daha fazla iş parçacığı kullanmayı denediğimde, PhantomJS sadece bir CPU kullanıyormuş gibi lineer bir yavaşlama yaşadım. Bu yavaşlama aşağıdaki gibi gösterilir (tek bir PhantomJS örneği için):

1 istemci iş parçacığı, ortalama istek süresi 0,44 saniye.
2 istemci konuları, ortalama istek süresi 0.76 saniye.
4 istemci konuları, ortalama istek süresi 1,5 saniye.

Bu bilinen bir PhantomJS sınırlaması mı? etrafında yol var mı?

+0

Bazılarını * burada * unuttun bağlantılar. –

+0

Daha ilginç bir soru, neden 1 ila 2 istemciden geçerek çift olmadı ve neden 2 ila 4 müşteriye geçerek iki katına çıktı? –

+0

Neredeyse iki katına çıktı, bence ölçümlerdeki hata payını hesaba katabilirsiniz. – Yoni

cevap

5

bu PhantomJS bilinen bir sınırlama var mı (soru da here yayınlanmıştır)? PhantomJS her şey için aynı WebKit motorunu kullandığı için

Evet, bu beklenen bir sınırlamadır ve JavaScript tek iş parçacıklı olduğu için, bu durum, her isteği (muhtemelen kilitlemeli) birbiri ardına ele alınacaktır anlamına gelir, ama asla aynı zamanda. Ortalama toplam süre, her müşteri ile doğrusal olarak artacaktır.

documentation diyor ki:

10 eşzamanlı istek bir sınır şu anda var; diğer istekler sıraya alınacaktır.

Eşzamanlı ve paralel isteklerin kavramları arasında bir fark vardır. Eşzamanlı sadece görevlerin deterministik olmayan şekilde bitirdiği anlamına gelir. Bu, görevlerin yapıldığı yönergelerin farklı (sanal) çekirdeklere paralel olarak yürütüldüğü anlamına gelmez.

Bunun bir yolu var mı? child_process aracılığıyla sunucu görevleri hiçbir çalışan dışında

. JavaScript'in çoklu iş parçacığı destekleme biçimi, Web İşçileri'ni kullanmaktır, ancak çalışan bir işçinin korumalı olduğunu ve require'a erişemediğini ve bu nedenle bir şeyler yapacak sayfalar oluşturamayacağını belirtir.

+1

Çok iş parçacıklı JS için web çalışanlarına ne dersiniz? – lintmouse

+0

Web çalışanları çok iş parçacıklı yürütmeyi etkinleştirir, ancak eşzamanlı istekler için bunları kullanıp kullanamayacağını bilmiyorum. Bu ilginç bir fikir. –

+0

Sadece bir WebWorker ile denedim, ama ne yazık ki işçide "ihtiyaç" yoktur, bu yüzden işlemi paralel hale getirmenin bir yolu yoktur. –