simplebridge.pyx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import asyncio
  2. from folly.futures cimport bridgeFuture
  3. from folly.fibers cimport bridgeFibers
  4. from folly cimport cFollyFuture, cFollyTry
  5. from libc.stdint cimport uint64_t
  6. from cpython.ref cimport PyObject
  7. from cython.operator cimport dereference as deref
  8. cdef extern from "folly/python/test/simple.h" namespace "folly::python::test":
  9. cdef cFollyFuture[uint64_t] future_getValueX5(uint64_t val)
  10. cdef (uint64_t(*)()) getValueX5Fibers(uint64_t val)
  11. def get_value_x5(int val):
  12. loop = asyncio.get_event_loop()
  13. fut = loop.create_future()
  14. bridgeFuture[uint64_t](
  15. future_getValueX5(val),
  16. handle_uint64_t,
  17. <PyObject *>fut
  18. )
  19. return fut
  20. def get_value_x5_fibers(int val):
  21. loop = asyncio.get_event_loop()
  22. fut = loop.create_future()
  23. bridgeFibers[uint64_t](
  24. getValueX5Fibers(val),
  25. handle_uint64_t,
  26. <PyObject *>fut
  27. )
  28. return fut
  29. cdef void handle_uint64_t(cFollyTry[uint64_t]&& res, PyObject* userData):
  30. future = <object> userData
  31. if res.hasException():
  32. try:
  33. res.exception().throw_exception()
  34. except Exception as ex:
  35. future.set_exception(ex)
  36. else:
  37. future.set_result(res.value())