|
31 | 31 | from .proxy_configuration import ProxyConfiguration
|
32 | 32 | from .storages import Dataset, KeyValueStore, RequestQueue, StorageClientManager
|
33 | 33 |
|
| 34 | +T = TypeVar('T') |
34 | 35 | MainReturnType = TypeVar('MainReturnType')
|
35 | 36 |
|
36 | 37 | # This metaclass is needed so you can do `async with Actor: ...` instead of `async with Actor() as a: ...`
|
@@ -629,19 +630,20 @@ async def _get_input_internal(self) -> Any:
|
629 | 630 | return input_value
|
630 | 631 |
|
631 | 632 | @classmethod
|
632 |
| - async def get_value(cls, key: str) -> Any: |
| 633 | + async def get_value(cls, key: str, default_value: Optional[T] = None) -> Any: |
633 | 634 | """Get a value from the default key-value store associated with the current actor run.
|
634 | 635 |
|
635 | 636 | Args:
|
636 | 637 | key (str): The key of the record which to retrieve.
|
| 638 | + default_value (Any, optional): Default value returned in case the record does not exist. |
637 | 639 | """
|
638 |
| - return await cls._get_default_instance().get_value(key=key) |
| 640 | + return await cls._get_default_instance().get_value(key=key, default_value=default_value) |
639 | 641 |
|
640 |
| - async def _get_value_internal(self, key: str) -> Any: |
| 642 | + async def _get_value_internal(self, key: str, default_value: Optional[T] = None) -> Any: |
641 | 643 | self._raise_if_not_initialized()
|
642 | 644 |
|
643 | 645 | key_value_store = await self.open_key_value_store()
|
644 |
| - value = await key_value_store.get_value(key) |
| 646 | + value = await key_value_store.get_value(key, default_value) |
645 | 647 | return value
|
646 | 648 |
|
647 | 649 | @classmethod
|
@@ -1110,38 +1112,48 @@ async def reboot(
|
1110 | 1112 | cls,
|
1111 | 1113 | *,
|
1112 | 1114 | event_listeners_timeout_secs: Optional[int] = EVENT_LISTENERS_TIMEOUT_SECS,
|
| 1115 | + custom_after_sleep_millis: Optional[int] = None, |
1113 | 1116 | ) -> None:
|
1114 | 1117 | """Internally reboot this actor.
|
1115 | 1118 |
|
1116 | 1119 | The system stops the current container and starts a new one, with the same run ID and default storages.
|
1117 | 1120 |
|
1118 | 1121 | Args:
|
1119 | 1122 | event_listeners_timeout_secs (int, optional): How long should the actor wait for actor event listeners to finish before exiting
|
| 1123 | + custom_after_sleep_millis (int, optional): How long to sleep for after the reboot, to wait for the container to be stopped. |
1120 | 1124 | """
|
1121 |
| - return await cls._get_default_instance().reboot(event_listeners_timeout_secs=event_listeners_timeout_secs) |
| 1125 | + return await cls._get_default_instance().reboot( |
| 1126 | + event_listeners_timeout_secs=event_listeners_timeout_secs, |
| 1127 | + custom_after_sleep_millis=custom_after_sleep_millis, |
| 1128 | + ) |
1122 | 1129 |
|
1123 | 1130 | async def _reboot_internal(
|
1124 | 1131 | self,
|
1125 | 1132 | *,
|
1126 | 1133 | event_listeners_timeout_secs: Optional[int] = EVENT_LISTENERS_TIMEOUT_SECS,
|
| 1134 | + custom_after_sleep_millis: Optional[int] = None, |
1127 | 1135 | ) -> None:
|
1128 | 1136 | self._raise_if_not_initialized()
|
1129 | 1137 |
|
1130 | 1138 | if not self.is_at_home():
|
1131 | 1139 | self.log.error('Actor.reboot() is only supported when running on the Apify platform.')
|
1132 | 1140 | return
|
1133 | 1141 |
|
| 1142 | + if not custom_after_sleep_millis: |
| 1143 | + custom_after_sleep_millis = self._config.metamorph_after_sleep_millis |
| 1144 | + |
1134 | 1145 | await self._cancel_event_emitting_intervals()
|
1135 | 1146 |
|
1136 | 1147 | self._event_manager.emit(ActorEventTypes.PERSIST_STATE, {'isMigrating': True})
|
1137 | 1148 | self._was_final_persist_state_emitted = True
|
1138 | 1149 |
|
1139 | 1150 | await self._event_manager.close(event_listeners_timeout_secs=event_listeners_timeout_secs)
|
1140 | 1151 |
|
1141 |
| - # If is_at_home() is True, config.actor_id is always set |
1142 |
| - assert self._config.actor_id is not None |
| 1152 | + assert self._config.actor_run_id is not None |
| 1153 | + await self._apify_client.run(self._config.actor_run_id).reboot() |
1143 | 1154 |
|
1144 |
| - await self.metamorph(self._config.actor_id) |
| 1155 | + if custom_after_sleep_millis: |
| 1156 | + await asyncio.sleep(custom_after_sleep_millis / 1000) |
1145 | 1157 |
|
1146 | 1158 | @classmethod
|
1147 | 1159 | async def add_webhook(
|
|
0 commit comments