Python中的多线程和多处理
我试图读取csv文件并计算线性处理所需的时间,使用线程和多处理,但我的代码似乎没有得到正确的输出。如果有人能帮我写代码那就太好了 多处理和线性处理: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
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-只要您正在读取不同的数据,并且不要过多地对其进行后期处理,当然,线程可以帮助减轻阻塞整个应用程序的痛苦,同时从导致延迟的资源(如数据库)加载数据。