Worker (işçi) öğeleri arasında iletişim

Masaüstü platformları için Flash Player 11.4 ve sonraki sürümleri, Adobe AIR 13.4 ve sonraki sürümleri

Worker (işçi) öğeleri kodlarını ayrı yürütme iş parçacıklarında çalıştırsa da birbirlerinden tamamen izole olmuş olsalardı, hiçbir fayda sağlayamazlardı. Worker (işçi) öğeleri arasındaki iletişim, temelde verilerin worker (işçi) öğeleri arasında geçirilmesi anlamına gelir. Bir worker (işçi) öğesinden diğerine veri aktarımını sağlayan üç ana mekanizma bulunur.

Belirli bir veri aktarımı ihtiyacı için hangi veri paylaşımı tekniklerinin uygun olduğuna karar verirken, farklılık gösterdikleri iki durumu dikkate alın. Bunların arasındaki bir fark, yeni verinin kullanılabilir olduğuna dair alıcıyı uyaran bir olay olup olmadığı veya alıcı worker (işçi) öğesinin güncelleme kontrolü yapmasının gerekip gerekmediğidir. Bu veri paylaşım teknikleri arasındaki diğer bir fark da verilerin fiilen iletilmesi ile ilişkilidir. Bazı durumlarda alıcı worker (işçi) paylaşılan verinin bir kopyasını alır, bu da daha fazla nesne oluşturulduğu ve bununla birlikte daha fazla bellek ve işlemci döngüsü kullanıldığı anlamına gelir. Diğer durumlarda worker (işçi) öğeleri aynı temel sistem belleğine başvuran nesnelere erişir, bu da daha az nesne oluşturulduğu ve toplamda daha az bellek kullanıldığı anlamına gelir. Bu farklar burada vurgulanmıştır:

İletişim tekniği

Veri alırken olayı gönderir

Worker (işçi) öğeleri arasında bellek paylaşır

Worker (İşçi) paylaşımlı özellikler

Hayır

Hayır, nesneler kopyalardan oluşuyor, referanslardan değil

MessageChannel

Evet

Hayır, nesneler kopyalardan oluşuyor, referanslardan değil

Paylaşılabilir ByteArray

Hayır

Evet, bellek paylaşılıyor

Verileri paylaşılan özellikle iletme

Worker (işçi) öğeleri arasında veri paylaşmanın en temel yolu, paylaşılan özellik kullanmaktır. Her worker (işçi), paylaşılan özellik değerlerine yönelik dahili bir sözlük tutar. Özellikler birbirinden ayırt edilebilmesi için Dize anahtar adlarıyla saklanır. Bir worker (işçi) üzerindeki bir nesneyi paylaşılan özellik olarak saklamak için, saklanacak anahtar adı ve değerden oluşan iki argümanla Worker nesnesinin setSharedProperty() yöntemini çağırın:

// code running in the parent worker 
bgWorker.setSharedProperty("sharedPropertyName", someObject);

Paylaşılan özellik ayarlandıktan sonra, değer, anahtar adı iletilecek şekilde Worker nesnesinin getSharedProperty() yöntemini çağırarak okunabilir:

// code running in the background worker 
receivedProperty = Worker.current.getSharedProperty("sharedPropertyName");

Hangi worker (işçi) öğesinin özellik değerini okuyacağı veya ayarlayacağı konusunda bir kısıtlama yoktur. Örneğin, arka plan worker (işçi) öğesindeki kod, bir değeri saklamak için setSharedProperty() yöntemini çağırabilir. Üst worker (işçi) öğesinde çalışan kod, verileri almak için getSharedProperty() öğesini kullanabilir.

setSharedProperty() yöntemine iletilen değer, neredeyse her türden bir nesne olabilir. getSharedProperty() yöntemini çağırdığınızda, döndürülen nesne, birkaç özel durum dışında, setSharedProperty() öğesine iletilen nesnenin bir kopyasıdır ve aynı nesneye yönelik bir başvuru değildir. Verilerin nasıl paylaşıldığına ilişkin ayrıntılar, Paylaşılan başvurular ve kopyalanan değerler konusunda açıklanmıştır.

Worker (işçi) öğeleri arasında veri iletmek üzere paylaşılan özellik kullanmanın en büyük avantajı, worker (işçi) çalıştırılmadan önce bile kullanılabilir olmasıdır. Worker (işçi) henüz çalıştırılmadan, paylaşılan özellik ayarlamak üzere arka plan Worker nesnesinin setSharedProperty() yöntemini çağırabilirsiniz. Üst worker (işçi) öğesi, Worker nesnesinin start() yöntemini çağırır; çalışma zamanı, alt worker (işçi) öğesinin ana sınıfının oluşturucusunu çağırır. start() çağrılmadan önce ayarlanan tüm paylaşılan özellikler, alt worker (işçi) öğesinin okuması amacıyla kod için kullanılabilir durumdadır.

Verileri MessageChannel ile iletme

Mesaj kanalı, iki worker (işçi) öğesi arasında tek yönlü bir veri iletme bağlantısı sağlar. Worker (işçi) öğeleri arasında veri geçirmek için MessageChannel nesnesinin kullanılması tek bir önemli avantaj sunar. Bir mesaj kanalını kullanarak mesaj (nesne) gönderdiğinizde, MessageChannel nesnesi bir channelMessage olayı gönderir. Alıcı worker (işçi) öğesindeki kod, veriler kullanılabilir olduğunda haberdar olmak için bu olayı dinleyebilir. Bu şekilde, alıcı worker (işçi) öğesinin sürekli olarak veri güncellemelerini denetlemesi gerekmez.

Bir mesaj kanalı, bir gönderen ve bir alıcı olmak üzere yalnızca iki worker (işçi) öğesiyle ilişkilidir. Bir MessageChannel nesnesi oluşturmak için, alıcı worker (işçi) öğesini bir argüman olarak geçirerek, gönderen Worker nesnesinin createMessageChannel() yöntemini çağırın.

// In the sending worker swf 
var sendChannel:MessageChannel; 
sendChannel = Worker.current.createMessageChannel(receivingWorker);

Her iki worker (işçi) öğesinin de MessageChannel nesnesine erişimi olmalıdır. Bunu yapmanın en basit yolu, MessageChannel nesnesini setSharedProperty() yöntemini kullanarak iletmektir:

receivingWorker.setSharedProperty("incomingChannel", sendChannel);

Alıcı worker (işçi) öğesinde, MessageChannel nesnesinin channelMessage olayı için bir dinleyici kaydedin. Bu olay, gönderen worker (işçi) öğesi, mesaj kanalı üzerinden veri gönderdiğinde gönderilir.

// In the receiving worker swf 
var incomingChannel:MessageChannel; 
incomingChannel = Worker.current.getSharedProperty("incomingChannel"); 
incomingChannel.addEventListener(Event.CHANNEL_MESSAGE, handleIncomingMessage);

Verileri gerçekten göndermek için, gönderen worker (işçi) öğesi, MessageChannel nesnesinin send() yöntemini çağırır:

// In the sending worker swf 
sendChannel.send("This is a message");

Alıcı worker (işçi) öğesinde, MessageChannel, channelMessage olay işleyicisini çağırır. Böylece alıcı worker (işçi) öğesi, verileri MessageChannel nesnesinin receive() yöntemini çağırarak alabilir.

private function handleIncomingMessage(event:Event):void 
{ 
    var message:String = incomingChannel.receive() as String; 
}

Alma yöntemi tarafından döndürülen nesne, send() yöntemine iletilen nesneyle aynı veri türüne sahiptir. Alınan nesne, Paylaşılan başvurular ve kopyalanan değerler konusunda açıklandığı şekilde, birkaç veri türünden birine ait olmadığı sürece, gönderen tarafından iletilen nesnenin bir kopyasıdır ve gönderen worker (işçi) öğesindeki nesneye yönelik bir başvuru değildir.

Paylaşılabilir ByteArray kullanarak veri paylaşımı

Bir nesnenin iki worker (işçi) öğesi arasında iletilmesi sırasında, alıcı worker (işçi) orijinal nesnenin bir kopyası olan yeni bir nesne alır. İki nesne sistem belleğinde farklı yerlerde saklanır. Sonuç olarak, nesneye ait alınan her bir kopya çalışma zamanı tarafından kullanılan toplam belleği arttırır. Buna ek olarak, bir worker (işçi) öğesindeki nesne üzerinde yapacağınız herhangi bir değişiklik diğer bir worker (işçi) öğesinde bulunan kopyayı etkilemez. Verilerin nasıl kopyalandığına dair daha ayrıntılı bilgi için Paylaşılan başvurular ve kopyalanan değerler bölümüne göz atın.

ByteArray nesnesi varsayılan olarak aynı davranışı kullanır. Worker (işçi) nesnesinin setSharedProperty() yöntemine veya MessageChannel nesnesinin send() yöntemine bir ByteArray örneği gönderildiğinde, çalışma zamanı bilgisayarın belleğinde yeni bir ByteArray oluşturur ve alıcı worker (işçi) bu yeni ByteArray öğesine referans olacak bir ByteArray örneği alır. Ancak, bir ByteArray nesnesi için bu davranışı nesneye ait shareable özelliğini true olarak ayarlayarak değiştirebilirsiniz.

Paylaşılabilir bir ByteArray nesnesi bir worker (işçi) öğesinden diğerine iletilirken, alıcı worker (işçi) öğesindeki ByteArray örneği, gönderici worker (işçi) öğesindeki ByteArray örneği tarafından kullanılan aynı temel işletim sistemi belleğine referans oluşturur. Bir worker (işçi) öğesindeki kod, bayt dizisindeki içeriği değiştirdiğinde, bu değişiklikler paylaşılan bayt dizisine erişimi olan diğer tüm worker (işçi) öğelerinde de anında kullanılabilir duruma gelir.

Worker (işçi) öğeleri kodlarını eş zamanlı olarak yürüttüğünden, iki worker (işçi) öğesinin bir bayt dizisindeki aynı baytlara aynı anda erişmeye çalışması mümkündür. Bu durum veri kaybına veya bozulmasına neden olabilir. Paylaşılan kaynaklara erişimi yönetmek ve bu sorunların önüne geçmek için kullanabileceğiniz birden çok API bulunur.

ByteArray sınıfı, bayt dizisinin içeriğini tek işlemde doğrulamanıza ve değiştirmenize olanak sağlayan yöntemler içerir:

Ek olarak, flash.concurrent paketi paylaşılan kaynaklarla çalışmak için erişim kontrolü sağlayan sınıflar içerir:

Paylaşılan başvurular ve kopyalanan değerler

Normal durumda, Worker.setSharedProperty() veya MessageChannel.send() öğesini çağırırsanız, alıcı worker (işçi) öğesine iletilen nesne, AMF formatında serileştirilerek iletilir. Bu, birkaç sonucu beraberinde getirir:

  • getSharedProperty() yöntemi çağrıldığında alıcı worker (işçi) öğesinde oluşturulan nesnenin AMF baytlarından serileştirmesi kaldırılır. Bu, orijinal nesnenin bir kopyasıdır, nesneye yönelik bir başvuru değildir. İki worker (işçi) öğesinden herhangi birinde nesne üzerinde yapılan değişiklikler, diğer worker (işçi) öğesindeki kopyada uygulanmaz.

  • Görüntüleme nesneleri gibi AMF formatında serileştirilemeyen nesneler, Worker.setSharedProperty() veya MessageChannel.send() kullanılarak bir worker (işçi) öğesine iletilemez.

  • Özel bir sınıfın doğru şekilde serileştirmesinin kaldırılması için, sınıf tanımının flash.net.registerClassAlias() işlevi veya [RemoteClass] meta verileri kullanılarak kaydedilmesi gerekir. Her iki worker (işçi) öğesinin sınıf sürümleri için de aynı başka ad kullanılmalıdır.

Worker (işçi) öğeleri arasında kopyalanmak yerine gerçek anlamda paylaşılan beş özel nesne durumu bulunur:

  • Worker nesneleri

  • MessageChannel nesneleri

  • paylaşılabilir bayt dizisi ( shareable özelliği true olan bir ByteArray nesnesi)

  • Mutex nesneleri

  • Condition nesneleri

Bu nesnelerden birine ait bir örneği Worker.setSharedProperty() yöntemini veya MessageChannel.send() yöntemini kullanarak iletirseniz, worker (işçi) öğelerinin her biri aynı alttaki nesneye yönelik bir başvuruya sahip olur. Bir worker (işçi) öğesinde örnek üzerinde yapılan değişiklikler, anında diğer worker (işçi) öğelerinde de uygulanır. Ayrıca, bu nesnelerden birine ait aynı örneği bir worker (işçi) öğesine bir defadan çok iletmeniz durumunda, çalışma zamanı, alıcı worker (işçi) öğesinde nesnenin yeni bir kopyasını oluşturmaz. Bunun yerine, aynı başvuru yeniden kullanılır.

Ek veri paylaşımı teknikleri

Worker (işçi) öğesine özel veri geçirme mekanizmalarına ek olarak, worker (işçi) öğeleri iki swf uygulaması arasında veri paylaşımını destekleyen şu gibi varolan api'lerden herhangi birini kullanarak da veri alışverişi yürütebilir:

  • yerel paylaşılan nesneler

  • bir worker (işçi) öğesindeki bir dosyaya veri yazma ve başka bir worker (işçi) öğesindeki bir dosyadan okuma

  • SQLite veritabanı üzerinde veri saklama ve veri okuma işlemlerini yapma

Bir kaynağı iki veya daha fazla worker (işçi) öğesi arasında paylaştığınızda, genellikle birden fazla worker (işçi) öğesinin aynı anda kaynağa erişmesini önlemeniz gerekir. Örneğin, birden çok worker (işçi) öğesinin yerel dosya sistemi üzerindeki bir dosyaya erişmesi, veri kaybına veya bozulmasına neden olabilir ve işletim sistemi tarafından desteklenmeyebilir.

Eşzamanlı erişim problemlerine karşı önlem almak ve paylaşılan kaynaklarla çalışmak için erişim kontrolü sağlamak üzere flash.concurrent paketindeki Mutex ve Condition sınıflarını kullanın.

Diğer veri paylaşma mekanizmalarının aksine, SQLite veritabanı motoru, eş zamanlı erişim için tasarlanmıştır ve yerleşik olarak kendi işlem desteğine sahiptir. Birden fazla worker (işçi) öğesi, verileri bozma riski olmadan bir SQLite veritabanına erişebilir. Worker (işçi) öğeleri farklı SQLConnection örnekleri kullandığından, her worker (işçi) veritabanına ayrı bir işlem içinde erişir. Aynı anda gerçekleştirilen veri düzenleme işlemleri, verilerin bütünlüğünü etkilemez.

Ayrıca bkz.

AIR'de yerel SQL veritabanlarıyla çalışma

flash.concurrent package