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

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Glenn Jocher 2023-07-13 18:56:10 +02:00 committed by GitHub
parent 9aca61c465
commit fadbef84e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 3 deletions

View File

@ -252,6 +252,36 @@ if WINDOWS: # emoji-safe logging
LOGGER.addFilter(EmojiFilter()) 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): def yaml_save(file='data.yaml', data=None):
""" """
Save YAML data to a file. Save YAML data to a file.

View File

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