python - 线程或多处理

标签 python multithreading

我有一些代码正在尝试加速。我的目标是下载并保存大约一百万个文件。我正在使用请求库来访问内容。我比以往任何时候都更加困惑。大多数 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/

相关文章:

python - 在 Python 中制作随机 3-D 形状

.net - 为什么 Windows\Assembly 中可能缺少 System.Threading.dll?

c++ - std::thread对象构造过程中的细节

python - 如何制作 必填 : boolean field in model Django

python - 有什么方法可以在 Django 管理站点中添加选项卡式表单?

python - 如何使用多线程在python中共享变量(不可修改)?

java - 使用BlockingQueue时的线程同步

c# - Thread.Start() 与 ThreadPool.QueueUserWorkItem()

将 python 字典转换为 sqlite

python - 使用 @property 装饰器 python 获取方法的源代码