【问题标题】:Muti threading and multiprocessing in PythonPython中的多线程和多处理
【发布时间】:2017-06-23 09:52:05
【问题描述】:

我正在尝试读取 csv 文件并使用线程和多处理来计算线性处理所需的时间,但我的代码似乎没有得到正确的输出。如果有人可以帮助我编写代码,那就太好了。

多处理和线性处理:

import csv
import time
import multiprocessing
from multiprocessing import Process

proces=[]
number_of_processes=2


class mulprocess():

    def data(self):

        with open('test.csv','r+') as f:

            reader=csv.reader(f)

            for row in reader:                  
                print row


    def processdata(self):

        for i in range(2):

            start_time=time.time()

            proces.append(multiprocessing.Process(target=self.data(),args=()))

        for p in proces:

            p.start()

        for p in proces:

            p.join()

        end_time=time.time()

        print end_time-start_time

a=mulprocess()
a.data()
a.processdata()

线程:

import csv
import time
import threading

thread_count=2
threads=[]

class Operation():

    def data(self):

        with open('test.csv','r+') as f:

            reader=csv.reader(f)

            for row in reader:
                print row


    def filedata(self):

        for i in range(thread_count):

            threads.append(threading.Thread(target=self.data,args=()))

        start_time=time.time()

        for t in threads:

            t.start()            
            t.join()

        end_time=time.time()

        print end_time-start_time


a=Operation()    
a.filedata()

【问题讨论】:

  • 为什么要多个进程从磁盘读取数据?
  • 如果他有2个磁盘怎么办? :) 如果涉及处理数据一点或更多怎么办?
  • 无论如何,不​​要为线程而烦恼,因为 GIL 的存在,它们无法实现良好的并行计算。仅当您希望另一个线程在第一个线程等待内容(例如输入或 HTTP 响应)时执行某些操作时才使用线程
  • @AlexanderMP 如果文件没有在要多处理的函数中硬编码,这可能是合理的。我认为多重访问比它的价值更麻烦,而且可能不会更快
  • 我想计算线程/进程数不同的 3 个进程的处理时间差异。我的 csv 文件有 20 万行,40 列,所以我想尝试多线程和多处理

标签: python multithreading python-multiprocessing


【解决方案1】:

忽略在不同进程中一遍又一遍地加载同一个文件的无意义(顺便说一句,这可能会导致并发错误,因为您正在以r+ 模式加载文件,有效地锁定它)和一般的不良建议将实例方法作为单独的进程调用的方法,问题的症结在于:

proces.append(multiprocessing.Process(target=self.data(), args=()))

您告诉multiprocessing.Process 实例的内容是将target 设置为您的self.data() 方法返回的任何内容,即None,因此您的进程没有任何可使用或调用的内容所以一切都在你的主进程中执行,当然,它需要双倍的时间。查看this answer 了解如何正确设置多处理基准。

至于threading - 没有理由尝试它,它的处理速度会比单线程方法慢。线程的唯一优势是半并行化 I/O 操作。

【讨论】:

  • 知道了。非常感谢。你能解释一下如何使用线程来实现半并行化 i/o 操作吗??
  • @anonymous - 当你使用threading.Thread 时,Python(至少是 CPython)使用真正的系统线程,由于可怕的 GIL,你不能同时运行多个线程您的系统上有多少个 CPU。这意味着,实际上,Python 线程不会并行运行(有一些例外,但对于手头的事情来说并不重要)。但是,GIL 可以在您的线程等待 I/O 操作(例如,读取文件或等待网络资源)时释放,因此您的整个应用程序在加载时不会被阻塞。
  • 至于如何 - 你已经得到它,但是你正在加载同一个文件(可能会阻塞其他加载)所以你当然不会得到任何加速 - 你所有的线程都在等待从某种意义上说是同一种资源。此外,您添加到线程中的任何额外处理实际上都会比在单个线程中运行所有处理要慢(由于上下文切换和类似的事情)。
  • 如果我从 Mongodb 或 MySQL 等数据库读取文件,我可以应用线程,因为它不会是 CPU 绑定进程??
  • @anonymous - 只要您正在读取不同的数据并且不要对它进行过多的后期处理,当然,线程可以帮助减轻在从资源中加载数据时阻塞整个应用程序的痛苦这会像数据库一样产生延迟。
猜你喜欢
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多