Küçük bir c sunucusu uygulaması geliştiriyoruz. Sunucu uygulaması bazı veri işlemlerini gerçekleştirir ve istemciye geri döner. Veri işlem parçasını yapılandırılabilir ve esnek tutmak için, Python'a gitmeye karar verdiğimiz çeşitli hazır modüllerin kullanılabilirliğine dayanarak komut dosyası kullanmaya karar verdik. C ve python arasındaki verileri göndermek/almak için Python-C API'sini kullanıyoruz.Python-C api eş zamanlılık sorunu
Algoritma şöyle çalışır: -
- Sunucu istemciden bazı verileri alır, bu veriler c oluşturulmuş bir sözlükte depolanır. Sözlük PyDict_New() işlevi kullanılarak oluşturulur; c. Giriş, api işlevi PyDict_SetItemString() kullanılarak sözlükte bir anahtar değer çifti olarak saklanır.
- Sonraki, python komut dosyasını PyRun_SimpleString(); komut dosyasını parametre olarak geçirme. Bu betik c'de oluşturulan sözlüğü kullanır. Unutmayın ki, c dilinde yaratılan sözlüğü, PyImport_AddModule() yöntemlerini kullanarak komut dosyasına erişilebildiğimizi lütfen unutmayın; ve PyModule_AddObject();
- Veri işlemenin sonucunu, komut dosyasında, yukarıda oluşturulan aynı sözlükte anahtar değer çifti olarak saklarız. C kodu daha sonra, betik yürütüldükten sonra sonuç değişkenine (anahtar/değer çifti) erişebilir.
Karşı karşıya olduğumuz sorun farklı müşteriler gelen eşzamanlı istek halinde olan sorun . Farklı istemcilerden birden çok istek geldiğinde, referans sayısı istisnalarını itiraz etme eğilimindeyiz. Bir kullanıcı için gelen her istek için, yalnızca o kullanıcı için bağımsız bir sözlük oluşturduğumuzu lütfen unutmayın. Bu sorunun üstesinden gelmek için PyRun_SimpleString(); PyEval_AcquireLock() içinde; ve PyEval_ReleaseLock(); ancak bunu yapmak, kod yürütmesinin engelleme çağrısı olmasını sağladı. Yani bir komut dosyası yürütmek için uzun zaman alıyorsa, diğer tüm kullanıcılar da bir yanıt beklemektedir.
Mümkün olan en iyi yaklaşımı önerebilir veya yanlış gittiğimiz noktalara işaretçiler verebilir misiniz? Lütfen daha fazla bilgi için bana ping.
Herhangi bir yardım/kılavuz takdir edilecektir.
Referans için teşekkürler Jane. Bu arada, bu fonksiyonlara çağrı yapmıştım, ama hala işe yaramayacak. – Will