pafy 多线程
Multi threading with pafy
我正在尝试在多个 pafy 实例上使用多线程来获取多个视频流。我的代码的简化版本:
import pafy
import threading
def get_playurl(url):
video = pafy.new(url)
best = video.getbest()
playurl = best.url
return playurl
threads = []
for i in range(5):
t = threading.Thread(target=get_playurl, args=("https://www.youtube.com/watch?v=erG5rgNYSdk&ab_channel=WeezerVEVO",))
t.start()
threads.append(t)
for thread in threads:
thread.join()
有些线程会成功获取 playurl,而有些线程会引发 ImportError:
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Users\my_name\AppData\Local\Programs\Python\Python39\Lib\threading.py", line 954, in _bootstrap_inner
self.run()
File "C:\Users\my_name\AppData\Local\Programs\Python\Python39\Lib\threading.py", line 892, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\my_name\VSCodeProjects\my_project\Whosebug_example.py", line 6, in get_playurl
video = pafy.new(url)
File "C:\Users\my_name\VSCodeProjects\my_project\.venv\lib\site-packages\pafy\pafy.py", line 122, in new
from .backend_youtube_dl import YtdlPafy as Pafy
ImportError: cannot import name 'YtdlPafy' from partially initialized module 'pafy.backend_youtube_dl' (most likely due to a circular import) (C:\Users\my_name\VSCodeProjects\my_project\.venv\lib\site-packages\pafy\backend_youtube_dl.py)
哪些成功,哪些引发异常似乎是随机的,每次都不同。我是线程的新手,所以不确定这里的问题是什么。我没有任何与这些模块同名的文件,我还安装了 youtube-dl 依赖项 + 更新了所有其他没有任何效果的文件。
感谢任何帮助:)
Pafy 显然使用延迟导入,当您使用线程时,您 运行 进入竞争状态,其中两个线程试图同时导入子模块。
我能想到的几个替代方案:
- 在
import pafy
之后将 import pafy.backend_youtube_dl
添加到您的主脚本,即使您不使用该导入,也要确保它已经加载。
- 对多进程而不是线程使用
multiprocessing
。
我正在尝试在多个 pafy 实例上使用多线程来获取多个视频流。我的代码的简化版本:
import pafy
import threading
def get_playurl(url):
video = pafy.new(url)
best = video.getbest()
playurl = best.url
return playurl
threads = []
for i in range(5):
t = threading.Thread(target=get_playurl, args=("https://www.youtube.com/watch?v=erG5rgNYSdk&ab_channel=WeezerVEVO",))
t.start()
threads.append(t)
for thread in threads:
thread.join()
有些线程会成功获取 playurl,而有些线程会引发 ImportError:
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Users\my_name\AppData\Local\Programs\Python\Python39\Lib\threading.py", line 954, in _bootstrap_inner
self.run()
File "C:\Users\my_name\AppData\Local\Programs\Python\Python39\Lib\threading.py", line 892, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\my_name\VSCodeProjects\my_project\Whosebug_example.py", line 6, in get_playurl
video = pafy.new(url)
File "C:\Users\my_name\VSCodeProjects\my_project\.venv\lib\site-packages\pafy\pafy.py", line 122, in new
from .backend_youtube_dl import YtdlPafy as Pafy
ImportError: cannot import name 'YtdlPafy' from partially initialized module 'pafy.backend_youtube_dl' (most likely due to a circular import) (C:\Users\my_name\VSCodeProjects\my_project\.venv\lib\site-packages\pafy\backend_youtube_dl.py)
哪些成功,哪些引发异常似乎是随机的,每次都不同。我是线程的新手,所以不确定这里的问题是什么。我没有任何与这些模块同名的文件,我还安装了 youtube-dl 依赖项 + 更新了所有其他没有任何效果的文件。
感谢任何帮助:)
Pafy 显然使用延迟导入,当您使用线程时,您 运行 进入竞争状态,其中两个线程试图同时导入子模块。
我能想到的几个替代方案:
- 在
import pafy
之后将import pafy.backend_youtube_dl
添加到您的主脚本,即使您不使用该导入,也要确保它已经加载。 - 对多进程而不是线程使用
multiprocessing
。