我有一些代码正在尝试加速。我的目标是下载并保存大约一百万个文件。我正在使用请求库来访问内容。我比以往任何时候都更加困惑。大多数 Q/A 建议正确的方法是在任务受 I/O 限制时使用线程模块,因为我正在连接到服务器,等待响应然后将响应写入磁盘,我的任务是 I/O绑定(bind)。
但后来我读到这样的东西
多个线程可以存在于一个进程中。属于同一个进程的线程共享同一个内存区域(可以读取和写入完全相同的变量,并且可以相互干扰)。
我的代码是这样的——在线程化之前
def create_list(some_ftp_site):
# do some stuff to compare the list to
# the last list and return the difference in the two
return list_to_pull
def download_and save_the_file(some_url):
thestring = requests.get(some_url).content
file_ref = open(something)
fileref.write(the_string)
fileref.close()
if __name__ == '__main__'
files_to_get = create_list(some_ftp_site)
if len(files_to_get) != 0:
for file_to_get in files_to_get:
download_and_save(file_to_get)
对我来说,使用任何一个都是跳入深端。因此,如果我对此进行多线程处理,我担心会发生一些意想不到的事情,例如某个文件的前半部分连接到另一个文件的后半部分。
这种类型的任务更适合多处理还是多线程。很明显,我不会知道两个不同的文件部分是否连接在一起,因为它们写入了同一个变量
最佳答案
两者都可以,但多处理会更安全,而且可能更容易实现。请记住,特别是对于 Python,Global Interpreter Lock意味着多线程不会从多核中获得太多好处,而多处理则不是问题。
关于python - 线程或多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18222229/