mirror of https://github.com/grpc/grpc.git
parent
2ed3d6bb5e
commit
bc157d5eb5
5 changed files with 64 additions and 30 deletions
@ -0,0 +1,60 @@ |
|||||||
|
# Copyright 2020 The gRPC authors. |
||||||
|
# |
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
# you may not use this file except in compliance with the License. |
||||||
|
# You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, software |
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
# See the License for the specific language governing permissions and |
||||||
|
# limitations under the License. |
||||||
|
|
||||||
|
def _contextvars_supported(): |
||||||
|
"""Determines if the contextvars module is supported. |
||||||
|
|
||||||
|
We use a 'try it and see if it works approach' here rather than predicting |
||||||
|
based on interpreter version in order to support older interpreters that |
||||||
|
may have a backported module based on, e.g. `threading.local`. |
||||||
|
|
||||||
|
Returns: |
||||||
|
A bool indicating whether `contextvars` are supported in the current |
||||||
|
environment. |
||||||
|
""" |
||||||
|
try: |
||||||
|
import contextvars |
||||||
|
return True |
||||||
|
except ImportError: |
||||||
|
return False |
||||||
|
|
||||||
|
|
||||||
|
def _run_with_context(target): |
||||||
|
"""Runs a callable with contextvars propagated. |
||||||
|
|
||||||
|
If contextvars are supported, the calling thread's context will be copied |
||||||
|
and propagated. If they are not supported, this function is equivalent |
||||||
|
to the identity function. |
||||||
|
|
||||||
|
Args: |
||||||
|
target: A callable object to wrap. |
||||||
|
Returns: |
||||||
|
A callable object with the same signature as `target` but with |
||||||
|
contextvars propagated. |
||||||
|
""" |
||||||
|
pass |
||||||
|
|
||||||
|
|
||||||
|
if _contextvars_supported(): |
||||||
|
import contextvars |
||||||
|
def _run_with_context(target): |
||||||
|
ctx = contextvars.copy_context() |
||||||
|
def _run(*args): |
||||||
|
ctx.run(target, *args) |
||||||
|
return _run |
||||||
|
else: |
||||||
|
def _run_with_context(target): |
||||||
|
def _run(*args): |
||||||
|
target(*args) |
||||||
|
return _run |
Loading…
Reference in new issue