Giter Club home page Giter Club logo

async-timeout's Introduction

async-timeout

image

image

image

Chat on Gitter

asyncio-compatible timeout context manager.

Usage example

The context manager is useful in cases when you want to apply timeout logic around block of code or in cases when asyncio.wait_for() is not suitable. Also it's much faster than asyncio.wait_for() because timeout doesn't create a new task.

The timeout(delay, *, loop=None) call returns a context manager that cancels a block on timeout expiring:

from async_timeout import timeout
async with timeout(1.5):
    await inner()
  1. If inner() is executed faster than in 1.5 seconds nothing happens.
  2. Otherwise inner() is cancelled internally by sending asyncio.CancelledError into but asyncio.TimeoutError is raised outside of context manager scope.

timeout parameter could be None for skipping timeout functionality.

Alternatively, timeout_at(when) can be used for scheduling at the absolute time:

loop = asyncio.get_event_loop()
now = loop.time()

async with timeout_at(now + 1.5):
    await inner()

Please note: it is not POSIX time but a time with undefined starting base, e.g. the time of the system power on.

Context manager has .expired property for check if timeout happens exactly in context manager:

async with timeout(1.5) as cm:
    await inner()
print(cm.expired)

The property is True if inner() execution is cancelled by timeout context manager.

If inner() call explicitly raises TimeoutError cm.expired is False.

The scheduled deadline time is available as .deadline property:

async with timeout(1.5) as cm:
    cm.deadline

Not finished yet timeout can be rescheduled by shift_by() or shift_to() methods:

async with timeout(1.5) as cm:
    cm.shift(1)  # add another second on waiting
    cm.update(loop.time() + 5)  # reschedule to now+5 seconds

Rescheduling is forbidden if the timeout is expired or after exit from async with code block.

Installation

$ pip install async-timeout

The library is Python 3 only!

Authors and License

The module is written by Andrew Svetlov.

It's Apache 2 licensed and freely available.

async-timeout's People

Contributors

alefteris avatar asvetlov avatar cclauss avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar dmi-feo avatar dreamsorcerer avatar fafhrd91 avatar hellysmile avatar hugovk avatar jamim avatar jellezijlstra avatar jettify avatar kentzo avatar kianmeng avatar m-kuhn avatar mgorny avatar pre-commit-ci[bot] avatar pwilczynskiclearcode avatar pyup-bot avatar rutsky avatar svenfuchs avatar sylwia-budzynska avatar tristan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

async-timeout's Issues

Tasks are not uncancelled in python 3.11

Python 3.11 introduced the concept of uncancelling a cancelled task.

From https://docs.python.org/3/library/asyncio-task.html#task-cancellation

user code should not generally call uncancel. However, in cases when suppressing asyncio.CancelledError is truly desired, it is necessary to also call uncancel() to completely remove the cancellation state.

async-timeout needs to be updated to run uncancel to be compliant with python 3.11.

An example of this being problematic is using async-timeout and something that uses anyio==3.7.1.
Here is a minimal example using httpx==0.24.1

import asyncio
import async_timeout
import httpx

async def main():
    try:
        async with async_timeout.timeout(1):
            await asyncio.sleep(5)
    except TimeoutError:
        pass

    client = httpx.AsyncClient()
    await client.get("https://www.google.com")

if __name__ == "__main__":
    asyncio.run(main())

This causes an asyncio.exceptions.CancelledError at the point of the await client.get(...) call, raised somewhere in anyio due to the cancelling state of the main task not being removed.

Version 3.0.0 fails on python 3.5.1

Hi!

It was added some type hints in version 3.0.0. But in python 3.5.1 typing.Type is not available.

from typing import Optional, Type
ImportError: cannot import name 'Type'

nesting

This is more of a question than a bug report.

Is nesting of timeout context managers supported? If it is, I would expect to find a test case (maybe I have missed it). In any case, it would be nice for this to be explicitly documented.

code is never stopped

in the end i want to run math but end it if it takes longer than x to complete but even this doesn't even stop

           async with timeout(5):
                await run_formula()

and

async def run_formula():
    for i in range(100):
        print(i)
        time.sleep(1)

it should stop at 0, 1, 2, 3, 4 but instead it counts all the way to 100

Discussion: should black and other packages be moved from requirements.txt

Currently requirements.txt has a host of packages that are at most needed in release prep or testing the package but not used in the production code. E.g. black, isort or flake8.

The downside of this is that the installation in production is unnecessarily bloated and may even conflict with other packages (which may specify a different version of the same packages). Another side effect is that since black is not out of pre-release, installation requires explicilty enabling pre-release in pip.

Is it possible to remove these from requirements.txt and put them in a separate file, so that any release processing tools that explicitly need them can do a pip install -r newfile and do the work?

Initial Update

Hi πŸ‘Š

This is my first visit to this fine repo, but it seems you have been working hard to keep all dependencies updated so far.

Once you have closed this issue, I'll create separate pull requests for every update as soon as I find one.

That's it for now!

Happy merging! πŸ€–

Python 3.5.3 requirement

Is there a hard requirement for Python 3.5.3? I am asking because ubuntu xenial ships with python 3.5.1 and therefore cannot install this package. If possible, could we change the requirement to python 3.5 instead?

Also note that distrbutions partially have large backports, so 3.5.1 is probably something like 3.5.1 with a pile of patches and probably similar enough to 3.5.3

Usage without context (as wait_for)

Is it possible to add support for calling timeout() with waitable as argument without creating context, or will it decrease performance?
I have a case where I use asyncio.wait_for for limiting only connection time of asyncssh.connect which itself creates connection context, but I don't want to limit commands execution time.

3.0.1: test suite warnings

+ /usr/bin/python3 -Bm pytest -ra
=========================================================================== test session starts ============================================================================
platform linux -- Python 3.8.9, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1, configfile: setup.cfg
plugins: forked-1.3.0, shutil-1.7.0, virtualenv-1.7.0, asyncio-0.14.0, expect-1.1.0, cov-2.11.1, mock-3.5.1, httpbin-1.0.0, xdist-2.2.1, flake8-1.0.7, timeout-1.4.2, betamax-0.8.1, pyfakefs-4.4.0, freezegun-0.4.2, flaky-3.7.0, cases-3.4.6, hypothesis-6.9.2
collected 25 items

tests/test_py35.py ....                                                                                                                                              [ 16%]
tests/test_timeout.py .....................                                                                                                                          [100%]

============================================================================= warnings summary =============================================================================
tests/test_py35.py::test_async_timeout
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_py35.py:13: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(10, loop=loop)

tests/test_py35.py::test_async_zero
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_py35.py:26: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(10, loop=loop)

tests/test_timeout.py::test_timeout
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:27: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(10, loop=loop)

tests/test_timeout.py::test_timeout_finish_in_time
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:43: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(0.01, loop=loop)

tests/test_timeout.py::test_timeout_disable
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:65: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(0.1, loop=loop)

tests/test_timeout.py::test_timeout_enable_zero
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:85: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(0.1, loop=loop)

tests/test_timeout.py::test_timeout_time
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:152: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(0.2, loop=loop)

tests/test_timeout.py::test_outer_coro_is_not_cancelled
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:178: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(1, loop=loop)

tests/test_timeout.py::test_cancel_outer_coro
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:195: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(1, loop=loop)

tests/test_timeout.py::test_timeout_suppress_exception_chain
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:210: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(10, loop=loop)

tests/test_timeout.py::test_timeout_expired
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:218: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(10, loop=loop)

tests/test_timeout.py::test_timeout_remaining
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:247: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(0.1, loop=loop)

tests/test_timeout.py::test_timeout_remaining
  /home/tkloczko/rpmbuild/BUILD/async-timeout-3.0.1/tests/test_timeout.py:252: DeprecationWarning: The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.
    await asyncio.sleep(0.5, loop=loop)

-- Docs: https://docs.pytest.org/en/stable/warnings.html

----------- coverage: platform linux, python 3.8.9-final-0 -----------
Name                        Stmts   Miss Branch BrPart  Cover
-------------------------------------------------------------
async_timeout/__init__.py      67      2     22      2    96%
-------------------------------------------------------------
TOTAL                          67      2     22      2    96%
Coverage HTML written to dir htmlcov

===================================================================== 25 passed, 13 warnings in 0.87s ======================================================================

shift_by replaces delay

Is shift_by meant to increase delay or replace delay. This raises TimeoutError after the 1st second:

import asyncio

from async_timeout import timeout


async def test():
    async with timeout(10) as cm:
        cm.shift_by(1)  # add another second on waiting
        await asyncio.sleep(5)


if __name__ == '__main__':
    asyncio.run(test())

Right now shift_by shifts to self._loop.time() + delay which replaces previous delay with a delay relative to current, not previously defined, time. Is this the expected behavior?

python 3.8.5
async-timeout 4.0.0a3

concurrent.futures._base.CancelledError for when timeout happend.

my code just as follows
`
import asyncio
import aioping
import logging

async def do_ping(host):
try:
delay = await aioping.ping(host, 0.9) * 1000
logging.info("ping response in {:.2f}ms".format(delay))

except TimeoutError:
    logging("ping timed out")

async def ping_for_ever(host):
while True:
await asyncio.sleep(1)
await do_ping(host)

loop = asyncio.get_event_loop()
loop.run_until_complete(ping_for_ever("x.x.x.x"))
`

There is no way to set `timeout=0` for immediate cancelation

timeout=0 will be set to None due https://github.com/aio-libs/async-timeout/blob/master/async_timeout/__init__.py#L22

timeout=0 or any special flag for instant timeout can be useful

As well it makes different behaviour with asyncio.wait_for, cuz it supports timeout=0

https://github.com/aio-libs/async-timeout/blob/master/async_timeout/__init__.py#L22

what about implementing timeout=async_timeout.immediate ? If it makes sense I'll do PR

Please tag a new stable release

Seems your current alpha is in a stable state, since tests keep passing on dependency updates. We would like to get aiohttp to cut a new release for us to package, as its tests for 3.6.2 result in many failures due to syntax changes in Python 3.8. aiohttp trunk currently requires 'async_timeout>=4.0a2,<5.0', and it would be great if you could tag a new stable release for downstream to use.

Initial Update

Hi πŸ‘Š

This is my first visit to this fine repo, but it seems you have been working hard to keep all dependencies updated so far.

Once you have closed this issue, I'll create seperate pull requests for every update as soon as I find one.

That's it for now!

Happy merging! πŸ€–

Add an expired property

  1. Context manager should return itself from __enter__.
  2. expired property should return True if timeout expired.

The change allows to figure out is asyncio.TimeoutError was raised by context manager itself or internal code, e.g.

try:
    async with timeout(1.0) as cm:
        await fetch()
except asyncio.TimeoutError:
    if cm.expired:
         # top level timeout
    else:
         # `fetch()` raised timeout itself

@hellysmile we discussed the change offline.
Do you agree with proposed API?

`asyncio.TimeoutError` raised on network timeout and CPU timeout

A key difference between async-timeout and asyncio.wait_for is that wait_for performs a final test that the task is completed before raising a TimeoutError, whereas async-timeout immediately raises the error when the timeout expires.

This difference is really important when a system is at 100% CPU usage.

Let's say you're making a HTTP request with a timeout of 15 seconds. The request takes 14.5 seconds to complete, but then the system hangs for a full second due to CPU contention.

  • async-timeout will report a timeout error, since the timeout will be triggered immediately after the program un-freezes, but before the task completes.
  • asyncio.wait_for will not report a timeout error, since it will perform a final check to see if the network request completed before raising the error.

In other words, async-timeout reports timeouts due to CPU and network, whereas wait_for, only reports timeouts due to network.

The result being that, in a system that experiences a brief CPU spike, a great many network requests apear to "time out". The reality is that the python interpreter hung for a second, and the nework is fine.

The affects me when using aiohttp. I've had to wrap the library with a shim that disables all built-in timeouts and wraps network calls with asyncio.wait_for.

aiohttp swallows asyncio.CancelledError during connection timeout

Describe the bug

There is a race condition in code that handles connection timeout. If you call cancel on a task that is currently pending in create_connection and connection timeout was already fired then asyncio.CancelledError is not propagated and you get asyncio.TimeoutError instead. The main problem is in how timeouts are handled in async_timeout package. When exitting the context manager after timeout had passed all CancelledError exceptions are swallowed and TimeoutError is raised instead. Unfortunately this is true also if you explicitly cancel the task yourself.

The main problem is that you cannot cancel a task that is using aiohttp because you never know if CancelledError will be raised.

To Reproduce

EDIT: THIS REPRODUCER DOES NOT SHOW THE BEHAVIOUR CORRECTLY - PLEASE REFER TO COMMENTS BELLOW!

import asyncio
from async_timeout import timeout


async def test_task():
    with timeout(1):
        await asyncio.sleep(10)


async def main():
    t = asyncio.create_task(test_task())
    await asyncio.sleep(2)
    t.cancel()
    try:
        await t
    except asyncio.TimeoutError:
        print("Raised TimeoutError")
    except asyncio.CancelledError:
        print("Raised CancelledError")

asyncio.run(main())

Expected behavior

asyncio.CancelledError should never be suppressed when you cancel the task explicitly.

Logs/tracebacks

---

Python Version

Python 3.8.10

aiohttp Version

3.7.4.post0

multidict Version

4.7.6

yarl Version

1.6.0

OS

Linux

Related component

Client

Additional context

No response

Code of Conduct

  • I agree to follow the aio-libs Code of Conduct

Add the remaining property into async timeout

It's useful to know how much time is remaining when scheduling tasks that either do not support asyncio's mechanics or provide an independent timeout.
One such example would be running a subprocess with a program that can accept a timeout:

async with timeout(1234) as t:
    p = await asyncio.create_subprocess_exec('iptables', '-w', int(t.remaining), ...)
    await p.wait()

The way to prevent raise asyncio.TimeoutError

Hello. Sorry for maybe stupid question.
Can I do something to prevent timeout error, except using try outside CM?
If no, maybe it is good idea to use some flag, for example silent=True to make such behavior possible?

Ner version release

The latest commits to the repository mention a new release (1.1.1), but there isn't a new release on github.
Was this intentional?
Thanks!

RuntimeError when using two event loops

original question

Steps to reproduce

requirements.txt

# Python 3.5.2
aiohttp==2.1.0
async-timeout==1.2.1
chardet==3.0.4
gunicorn==19.7.1
multidict==2.1.6
yarl==0.10.3
  1. code in test.py :
import asyncio
import async_timeout
from aiohttp import web

asyncio.set_event_loop(asyncio.new_event_loop())

class A:
    async def am(self):
        with async_timeout.timeout(timeout=1):
            await asyncio.sleep(0.5)

class B:
    a = A()
    async def bm(self):
        await self.a.am()

b = B()

async def hello(request):
    await b.bm()
    return web.Response(text="Hello, world")

app = web.Application()
app.router.add_get('/', hello)
  1. run this command gunicorn test:app --worker-class aiohttp.GunicornWebWorker -b 127.0.0.1:8000

  2. make request to https://127.0.0.1:8000/ URL.

Get RuntimeError: Timeout context manager should be used inside a task error message.

question

Why in this case async_timeout class have been initialised with developer-defined event loop instead gunicorn-defined (aiohttp.GunicornWebWorker)? How can library provide more informative message to help developer understand why it isn't working?

Can I use the loop parameter in synchronous code?

Here's some code I have:

@memoize
def get_thumbnail_url(url):
    async def get_url(url):
        try:
            return Scraper.for_url(url).scrape()
        except (HTTPError, URLError):
            return None

    async def get_url_with_timeout(url):
        with timeout(30):
            return await get_url(url)
        return None

    return _LOOP.run_until_complete(get_url_with_timeout(url))

I'm wondering if I can avoid having to write run_until_complete by somehow passing _LOOP into timeout. Is that possible?

Cancelling current task

I'm using aiohttp's WebSocket client and want to set my own exception for the current task on message receive timeout. But currently it's impossible due to async-timeout's task cancelling.
Ref: https://github.com/aio-libs/aiohttp/blob/master/aiohttp/client_ws.py#L195

Simple example listing:

import asyncio

from async_timeout import timeout


async def main():
    try:
        async with timeout(1):
            await asyncio.sleep(2)
    except asyncio.TimeoutError:
        future.set_exception(Exception('My exception'))


future = asyncio.ensure_future(main())

loop = asyncio.get_event_loop()
loop.run_forever()

Output:

$ python test_timeout.py
Exception in callback <TaskWakeupMethWrapper object at 0x7f0d9414bbb8>(<Future cancelled>)
handle: <Handle <TaskWakeupMethWrapper object at 0x7f0d9414bbb8>(<Future cancelled>)>
Traceback (most recent call last):
  File "/usr/lib/python3.6/asyncio/events.py", line 145, in _run
    self._callback(*self._args)
asyncio.base_futures.InvalidStateError: invalid state

How can I set my own exception if it possible?

Missing typing_extensions package

I'm using a package that has async-timeout as a dependency, recently I have started getting an error about a missing package in async-timout:

  ...
  File "/usr/local/lib/python3.7/site-packages/async_timeout/__init__.py", line 8, in <module>
    from typing_extensions import final
ModuleNotFoundError: No module named 'typing_extensions'

Wanted to make you aware. Thanks! :-)

Missing pypi upload

Hey, looks like there's a release on github that hasn't been pushed to pypi. Just checking in to see if this is intended or just an oversight.

Compatibility issues with pipenv and python 3.9

Hello
there is problem using this library with python 3.9.

$ python3
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import async_timeout
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/dist-packages/async_timeout/__init__.py", line 8, in <module>
    from typing_extensions import final
ModuleNotFoundError: No module named 'typing_extensions'

I see that there is already fix for it in your code
https://github.com/aio-libs/async-timeout/blob/master/async_timeout/__init__.py#L9

Could you please release it as soon as possible?

Thank you
& stay safe

Jozef

Don't suppress nested exception on raising TimeoutError

Information about what internal IO operation was interrupted by timeout expiring is important in some cases, it allows to figure out what exact IO takes too long time.

raise TimeoutError from None should be replaced with raise TimeoutError from exc

Add `msg` to `task.cancel()` method to allow distinguish the source of cancellation

How about adding msg argument to task.cancel()?

TL;DR:

def _on_timeout(self, task: "asyncio.Task[None]") -> None:
    task.cancel(msg="timeout")  # <--- add the reason of cancellation
    self._state = _State.TIMEOUT
    # drop the reference early
    self._timeout_handler = None

This would be useful to distinguish the reason of cancellation in library's user programs.

Initial Update

Hi πŸ‘Š

This is my first visit to this fine repo, but it seems you have been working hard to keep all dependencies updated so far.

Once you have closed this issue, I'll create separate pull requests for every update as soon as I find one.

That's it for now!

Happy merging! πŸ€–

Add methods for using as async context manager

Now we should use just with timeout(): statement.
It works pretty well but people feedback is a bit confusing: why with instead of async with.

I think it makes sense. Technically timeout support doesn't need async api but it makes learning curve smoother.

a bug or ?

i set 1000 seconds
but only the first time it runs well
next round only 10 seconds , it says timeout
what's wrong with my code?

async def _run_debug_mode(self):
    for idx, wallet in enumerate(self.wallets):
        await self._run_timeout(wallet=wallet, delay=(idx + 1)*self.timeout_each_account)
        await self.end_session()


async def _run_timeout(self, wallet=None, delay=None):
    begin_time = datetime.datetime.now()
    try:
        async with async_timeout.timeout(delay) as cm:
            await self._run_one(wallet)
    except:
        await self.end_session()
        end_time = datetime.datetime.now()
        msg = f'θΏθ‘ŒθΆ…ζ—Ά: {wallet.wallet} || θ€—ζ—Ά: {end_time-begin_time}'
        self.write_log(msg)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.