Пример #1
0
    async def create(cls, address: str, **kw):
        dones, _ = await asyncio.wait([
            mo.create_actor(SupervisorPeerLocatorActor,
                            'fixed',
                            address,
                            uid=SupervisorPeerLocatorActor.default_uid(),
                            address=address),
            mo.create_actor(MockNodeInfoCollectorActor,
                            uid=NodeInfoCollectorActor.default_uid(),
                            address=address),
            mo.create_actor(NodeInfoUploaderActor,
                            NodeRole.WORKER,
                            interval=kw.get('upload_interval'),
                            band_to_slots=kw.get('band_to_slots'),
                            use_gpu=kw.get('use_gpu', False),
                            uid=NodeInfoUploaderActor.default_uid(),
                            address=address),
        ])

        for task in dones:
            try:
                task.result()
            except mo.ActorAlreadyExist:  # pragma: no cover
                pass

        api = await super().create(address=address)
        await api.mark_node_ready()
        return api
Пример #2
0
async def test_slot_assign(actor_pool: ActorPoolType):
    pool, slot_manager_ref = actor_pool

    call_logs = dict()
    group_size = 4
    delay = 1
    await asyncio.gather(*(mo.create_actor(TaskActor,
                                           call_logs,
                                           slot_id=slot_id,
                                           uid=TaskActor.gen_uid(slot_id),
                                           address=pool.external_address)
                           for slot_id in range(group_size)))
    assert len((await slot_manager_ref.dump_data()).free_slots) == group_size

    async def task_fun(idx):
        slot_id = await slot_manager_ref.acquire_free_slot(
            ('session_id', 'subtask_id'))
        ref = await mo.actor_ref(uid=TaskActor.gen_uid(slot_id),
                                 address=pool.external_address)
        await ref.queued_call(idx, delay)

    tasks = []
    start_time = time.time()
    for idx in range(group_size + 1):
        tasks.append(asyncio.create_task(task_fun(idx)))
    await asyncio.gather(*tasks)

    log_series = pd.Series(call_logs).sort_index() - start_time
    assert len(log_series) == group_size + 1
    assert log_series.iloc[:group_size].max() < delay / 4
    assert log_series.iloc[group_size:].min() > delay / 4

    call_logs.clear()
    tasks = []
    start_time = time.time()
    for idx in range(group_size * 2 + 1):
        tasks.append(asyncio.create_task(task_fun(idx)))
    await asyncio.sleep(delay / 10)
    tasks[group_size].cancel()
    await asyncio.wait(tasks)

    with pytest.raises(asyncio.CancelledError):
        tasks[group_size].result()

    log_series = pd.Series(call_logs).sort_index() - start_time

    assert len(log_series) == group_size * 2
    assert log_series.iloc[:group_size].max() < delay / 4
    assert log_series.iloc[group_size:].min() > delay / 4