Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的多线程和多处理_Python_Multithreading_Python Multiprocessing - Fatal编程技术网

Python中的多线程和多处理

Python中的多线程和多处理,python,multithreading,python-multiprocessing,Python,Multithreading,Python Multiprocessing,我试图读取csv文件并计算线性处理所需的时间,使用线程和多处理,但我的代码似乎没有得到正确的输出。如果有人能帮我写代码那就太好了 多处理和线性处理: import csv import time import multiprocessing from multiprocessing import Process proces=[] number_of_processes=2 class mulprocess(): def data(self): with ope

我试图读取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()

忽略在不同进程中反复加载同一文件的无意义(顺便说一句,这可能会导致并发错误,因为您正在
r+
模式下加载文件,并将其有效锁定)以及将实例方法作为单独进程调用的一般不明智方法,问题的关键在于:

proces.append(multiprocessing.Process(target=self.data(), args=()))
您告诉
多处理.Process
实例的是将
目标
设置为
self.data()
方法返回的任何值,即
None
,因此您的进程无法处理或调用任何内容,因此所有内容都在主进程中执行,当然,这需要双倍的时间。查看如何正确设置多处理基准


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

为什么需要多个进程从磁盘读取数据?如果他有两个磁盘怎么办?:)如果它涉及到处理一点或更多的数据呢?无论如何,不要为线程而烦恼,因为由于GIL,线程无法使良好的并行计算成为可能。仅当您希望另一个线程在第一个线程等待内容(如输入或HTTP响应)时才使用线程@AlexanderMP,如果该文件未在函数中硬编码为多处理,则这可能是合理的。我认为多址访问比它的价值更麻烦,而且可能不会更快。我想计算3个进程在不同线程数/进程数下的处理时间差异。我的csv文件有20万行40列,所以我想尝试多线程和多处理,明白了吗。谢谢。你能解释一下如何使用线程实现半并行i/o操作吗???@anonymous——而Python(至少是CPython)在使用
线程时使用真实的系统线程。线程
,由于可怕的GIL,无论系统上有多少CPU,都不能同时运行多个线程。这意味着,实际上,Python线程不会并行运行(存在某些异常,但对手头的事情来说并不重要)。但是,GIL可以在线程等待I/O操作(例如,读取文件或等待网络资源)时释放,这样在加载某个文件时,整个应用程序不会被阻止。至于如何-你已经得到了它,但是你正在加载同一个文件(可能会阻止其他加载)因此,当然,您不会得到任何加速—从某种意义上说,您的所有线程都在等待相同的资源。此外,添加到线程中的任何附加处理实际上都比在单个线程中运行要慢(由于上下文切换和类似的原因),我可以正确地应用线程,因为它不会是一个CPU受限的进程???@anonymous-只要您正在读取不同的数据,并且不要过多地对其进行后期处理,当然,线程可以帮助减轻阻塞整个应用程序的痛苦,同时从导致延迟的资源(如数据库)加载数据。