diff --git a/worker/api/python/asapo_worker.pxd b/worker/api/python/asapo_worker.pxd index de9231176777eeb34be425877bc8650469875f84..a3e2dcc82d7c9ece7bc43f20c718786089b6088b 100644 --- a/worker/api/python/asapo_worker.pxd +++ b/worker/api/python/asapo_worker.pxd @@ -32,7 +32,7 @@ cdef extern from "asapo_worker.h" namespace "asapo": FileInfos content -cdef extern from "asapo_worker.h" namespace "asapo": +cdef extern from "asapo_worker.h" namespace "asapo" nogil: cdef cppclass DataBroker: DataBroker() except + void SetTimeout(uint64_t timeout_ms) @@ -50,7 +50,7 @@ cdef extern from "asapo_worker.h" namespace "asapo": Error RetrieveData(FileInfo* info, FileData* data) -cdef extern from "asapo_worker.h" namespace "asapo": +cdef extern from "asapo_worker.h" namespace "asapo" nogil: cdef cppclass DataBrokerFactory: DataBrokerFactory() except + unique_ptr[DataBroker] CreateServerBroker(string server_name,string source_path,string beamtime_id,string token,Error* error) diff --git a/worker/api/python/asapo_worker.pyx.in b/worker/api/python/asapo_worker.pyx.in index 14dd75c33b55de954c89621613828b4e69601647..e1ae14941e3736a7aac429853e1f37e00ca28110 100644 --- a/worker/api/python/asapo_worker.pyx.in +++ b/worker/api/python/asapo_worker.pyx.in @@ -5,6 +5,7 @@ import numpy as np cimport numpy as np import json from cpython.version cimport PY_MAJOR_VERSION +from libcpp.string cimport string np.import_array() @@ -30,17 +31,22 @@ cdef bytes _bytes(s): cdef class PyDataBroker: cdef DataBroker* c_broker - def _op(self, op, group_id, meta_only,id): + def _op(self, op, group_id, meta_only, uint64_t id): cdef FileInfo info + cdef string b_group_id = _bytes(group_id) + cdef FileData* p_data = <FileData*>NULL if meta_only else &data cdef FileData data cdef Error err cdef np.npy_intp dims[1] if op == "next": - err = self.c_broker.GetNext(&info, _bytes(group_id), <FileData*>NULL if meta_only else &data) + with nogil: + err = self.c_broker.GetNext(&info, b_group_id, p_data) elif op == "last": - err = self.c_broker.GetLast(&info,_bytes(group_id), <FileData*>NULL if meta_only else &data) + with nogil: + err = self.c_broker.GetLast(&info, b_group_id, p_data) elif op == "id": - err = self.c_broker.GetById(id, &info,_bytes(group_id), <FileData*>NULL if meta_only else &data) + with nogil: + err = self.c_broker.GetById(id, &info, b_group_id, p_data) err_str = _str(GetErrorString(&err)) if err_str.strip(): return None,None,err_str @@ -66,7 +72,8 @@ cdef class PyDataBroker: return None,"wrong metadata" cdef Error err cdef FileData data - err = self.c_broker.RetrieveData(&info, &data) + with nogil: + err = self.c_broker.RetrieveData(&info, &data) err_str = _str(GetErrorString(&err)) if err_str.strip(): return None,err_str @@ -78,15 +85,19 @@ cdef class PyDataBroker: return arr,None def get_ndatasets(self): cdef Error err - size = self.c_broker.GetNDataSets(&err) + cdef uint64_t size + with nogil: + size = self.c_broker.GetNDataSets(&err) err_str = _str(GetErrorString(&err)) if err_str.strip(): return None,err_str else: return size,None def reset_counter(self,group_id): + cdef string b_group_id = _bytes(group_id) cdef Error err - err = self.c_broker.ResetCounter(_bytes(group_id)) + with nogil: + err = self.c_broker.ResetCounter(b_group_id) err_str = _str(GetErrorString(&err)) if err_str.strip(): return err_str @@ -95,16 +106,19 @@ cdef class PyDataBroker: def generate_group_id(self): cdef Error err cdef string group_id - group_id = self.c_broker.GenerateNewGroupId(&err) + with nogil: + group_id = self.c_broker.GenerateNewGroupId(&err) err_str = _str(GetErrorString(&err)) if err_str.strip(): return None, err_str else: return _str(group_id), None def query_images(self,query): + cdef string b_query = _bytes(query) cdef Error err cdef FileInfos file_infos - file_infos = self.c_broker.QueryImages(_bytes(query),&err) + with nogil: + file_infos = self.c_broker.QueryImages(b_query,&err) err_str = _str(GetErrorString(&err)) if err_str.strip(): return None, err_str @@ -113,16 +127,20 @@ cdef class PyDataBroker: for fi in file_infos: json_list.append(json.loads(_str(fi.Json()))) return json_list, None - def _op_dataset(self, op, group_id, id): + def _op_dataset(self, op, group_id, uint64_t id): + cdef string b_group_id = _bytes(group_id) cdef FileInfos file_infos cdef DataSet dataset cdef Error err if op == "next": - dataset = self.c_broker.GetNextDataset(_bytes(group_id),&err) + with nogil: + dataset = self.c_broker.GetNextDataset(b_group_id, &err) elif op == "last": - dataset = self.c_broker.GetLastDataset(_bytes(group_id),&err) + with nogil: + dataset = self.c_broker.GetLastDataset(b_group_id, &err) elif op == "id": - dataset = self.c_broker.GetDatasetById(id,_bytes(group_id),&err) + with nogil: + dataset = self.c_broker.GetDatasetById(id, b_group_id, &err) err_str = _str(GetErrorString(&err)) if err_str.strip(): return None, None, err_str @@ -144,7 +162,8 @@ cdef class PyDataBroker: def get_beamtime_meta(self): cdef Error err cdef string meta_str - meta_str = self.c_broker.GetBeamtimeMeta(&err) + with nogil: + meta_str = self.c_broker.GetBeamtimeMeta(&err) err_str = _str(GetErrorString(&err)) if err_str.strip(): return None, err_str @@ -156,10 +175,18 @@ cdef class PyDataBroker: cdef class PyDataBrokerFactory: cdef DataBrokerFactory c_factory def __cinit__(self): - self.c_factory = DataBrokerFactory() + with nogil: + self.c_factory = DataBrokerFactory() def create_server_broker(self,server_name,source_path,beamtime_id,token,timeout): + cdef string b_server_name = _bytes(server_name) + cdef string b_source_path = _bytes(source_path) + cdef string b_beamtime_id = _bytes(beamtime_id) + cdef string b_token = _bytes(token) cdef Error err - cdef unique_ptr[DataBroker] c_broker = self.c_factory.CreateServerBroker(server_name,source_path,beamtime_id,token,&err) + cdef unique_ptr[DataBroker] c_broker + with nogil: + c_broker = self.c_factory.CreateServerBroker( + b_server_name, b_source_path, b_beamtime_id, b_token, &err) broker = PyDataBroker() broker.c_broker = c_broker.release() broker.c_broker.SetTimeout(timeout)