2016-04-10 14 views
1

Bir python betiğini, her satırın bir görevi tanımladığı ve komut dizimin her çalışan örneğinin böyle bir şey yapacağı bir "görevler" tablosu kullanarak paralel hale getirmeye çalışıyorum basitleştirilmiş piton + peewee kodu: Ben aynı anda Senaryomun 2 örneklerini başladığındamariadb select + update işlemini seçilemedi atomik olarak çalıştır

with db.transaction() as txn: 
    result = list(Table.raw("select id from tasks where started=0 limit 1")) 
    if len(result) == 0: 
     sys.exit("nothing left to do") 

    my_next_task = result[0] 

    # mark this task as started 
    Table.raw("update tasks set started=1 where id=%s" % my_next_task.id) 

# process my_next_task 

Ancak, her ikisi de aynı görev üzerinde çalışmaya başlamak. Bu davada işlemlerin nasıl yapılacağını yanlış anladım mı?

cevap

1

Bunu deneyin. Aşağıdaki kodu yalnızca 1 iplik görevi bir işlemi yaptığını

1.The gerçeği yürütmeden önce kilidi elde olması garanti edilir, emin sadece 1 evre aynı

2'de bir güncelleme yapabilir hale getirir. Unutmayın ki, başlangıç ​​için kontrol etmeliyiz = 0. Bu, yalnızca 1 iş parçacığının güncelleştirmeyi

with db.transaction() as txn: 
    result = list(Table.raw("select id from tasks where started=0 limit 1")) 

    // The update query should return number of rows updated. So if a thread updates the task, it should return 1, which means it acquired a lock. If not, it means the thread didn't acquire the lock 
    got_lock = Table.raw("update tasks set started=1 where id=%s and started = 0" % my_next_task.id) > 0 

    if len(result) == 0: 
     sys.exit("nothing left to do") 

    my_next_task = if(got_lock) result[0] else return 
+0

yapabildiğini garanti eder. Teşekkürler! Çalışması gereken (başlangıçta <0 başlangıçta = 0 anlamına geldiğine inanıyorum) – user3911479

+0

Yanlış anlaşılıyorum o zaman. Bir işlemde birçok soruyu gruplandırmamak, bunların 1 atomik işlem olarak (ya da aksi halde geri alınırken) birlikte çalışacağını garanti etmez mi? – user3911479

+0

Yea, demek istedim = 0 – Rahul