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:
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
|
|
|