Initialize the FDB interface. Consider using open() as a higher-level interface. Keyword arguments: event_model -- the event model to support (default None, also 'gevent')
(event_model=None)
| 1601 | |
| 1602 | |
| 1603 | def init(event_model=None): |
| 1604 | """Initialize the FDB interface. |
| 1605 | |
| 1606 | Consider using open() as a higher-level interface. |
| 1607 | |
| 1608 | Keyword arguments: |
| 1609 | event_model -- the event model to support (default None, also 'gevent') |
| 1610 | |
| 1611 | """ |
| 1612 | with _network_thread_reentrant_lock: |
| 1613 | global _network_thread |
| 1614 | |
| 1615 | # init should only succeed once; if _network_thread is not |
| 1616 | # None, someone has already successfully called init |
| 1617 | if _network_thread: |
| 1618 | raise FDBError(2000) |
| 1619 | |
| 1620 | try: |
| 1621 | class NetworkThread(threading.Thread): |
| 1622 | def run(self): |
| 1623 | try: |
| 1624 | _capi.fdb_run_network() |
| 1625 | except FDBError as e: |
| 1626 | sys.stderr.write('Unhandled error in FoundationDB network thread: %s\n' % e) |
| 1627 | # print('Network stopped') |
| 1628 | |
| 1629 | _network_thread = NetworkThread() |
| 1630 | _network_thread.daemon = True |
| 1631 | # may not set actual underlying OS thread name |
| 1632 | _network_thread.name = "fdb-network-thread" |
| 1633 | |
| 1634 | if event_model is not None: |
| 1635 | if event_model == 'gevent': |
| 1636 | import gevent |
| 1637 | |
| 1638 | if gevent.__version__[0] != '0': |
| 1639 | def nullf(): |
| 1640 | pass |
| 1641 | |
| 1642 | class ThreadEvent(object): |
| 1643 | has_async_ = hasattr(gevent.get_hub().loop, 'async_') |
| 1644 | def __init__(self): |
| 1645 | if ThreadEvent.has_async_: |
| 1646 | self.gevent_async = gevent.get_hub().loop.async_() |
| 1647 | else: |
| 1648 | self.gevent_async = getattr(gevent.get_hub().loop, 'async')() |
| 1649 | |
| 1650 | self.gevent_async.start(nullf) |
| 1651 | |
| 1652 | def set(self): |
| 1653 | self.gevent_async.send() |
| 1654 | |
| 1655 | def wait(self): |
| 1656 | gevent.get_hub().wait(self.gevent_async) |
| 1657 | else: |
| 1658 | # gevent 0.x doesn't have async, so use a pipe. This doesn't work on Windows. |
| 1659 | if platform.system() == 'Windows': |
| 1660 | raise Exception("The 'gevent' event_model requires gevent 1.0 on Windows.") |