Fix `Arial.ttf` threaded multi-download bug (#3725)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
pull/3738/head
Glenn Jocher 1 year ago committed by GitHub
parent 9aca61c465
commit fadbef84e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 30
      ultralytics/yolo/utils/__init__.py
  2. 7
      ultralytics/yolo/utils/checks.py

@ -252,6 +252,36 @@ if WINDOWS: # emoji-safe logging
LOGGER.addFilter(EmojiFilter())
class ThreadingLocked:
"""
A decorator class for ensuring thread-safe execution of a function or method.
This class can be used as a decorator to make sure that if the decorated function
is called from multiple threads, only one thread at a time will be able to execute the function.
Attributes:
lock (threading.Lock): A lock object used to manage access to the decorated function.
Usage:
@ThreadingLocked()
def my_function():
# Your code here
pass
"""
def __init__(self):
self.lock = threading.Lock()
def __call__(self, f):
from functools import wraps
@wraps(f)
def decorated(*args, **kwargs):
with self.lock:
return f(*args, **kwargs)
return decorated
def yaml_save(file='data.yaml', data=None):
"""
Save YAML data to a file.

@ -20,9 +20,9 @@ import requests
import torch
from matplotlib import font_manager
from ultralytics.yolo.utils import (AUTOINSTALL, LOGGER, ONLINE, ROOT, USER_CONFIG_DIR, TryExcept, clean_url, colorstr,
downloads, emojis, is_colab, is_docker, is_jupyter, is_kaggle, is_online,
is_pip_package, url2file)
from ultralytics.yolo.utils import (AUTOINSTALL, LOGGER, ONLINE, ROOT, USER_CONFIG_DIR, ThreadingLocked, TryExcept,
clean_url, colorstr, downloads, emojis, is_colab, is_docker, is_jupyter, is_kaggle,
is_online, is_pip_package, url2file)
def is_ascii(s) -> bool:
@ -155,6 +155,7 @@ def check_pip_update_available():
return False
@ThreadingLocked()
def check_font(font='Arial.ttf'):
"""
Find font locally or download to user's configuration directory if it does not already exist.

Loading…
Cancel
Save