Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 - Fatal编程技术网

Python 时间比较多线程

Python 时间比较多线程,python,multithreading,Python,Multithreading,我有一个程序,可以读取一些输入文本文件,然后将它们全部写入一个单独的文件中。我使用了两个线程,所以它运行得更快! 我用一个线程和两个线程尝试了下面的python代码!为什么当我用一个线程运行时,它比用两个线程运行时运行得更快 processedFiles=[] #为线程定义一个函数 def打印时间(线程名称、延迟): 对于glob.glob(“*.txt”)中的文件: #检查文件是否已被其他线程读取 如果文件不在processedFiles中: processedFiles.append(文件

我有一个程序,可以读取一些输入文本文件,然后将它们全部写入一个单独的文件中。我使用了两个线程,所以它运行得更快! 我用一个线程和两个线程尝试了下面的python代码!为什么当我用一个线程运行时,它比用两个线程运行时运行得更快

processedFiles=[]
#为线程定义一个函数
def打印时间(线程名称、延迟):
对于glob.glob(“*.txt”)中的文件:
#检查文件是否已被其他线程读取
如果文件不在processedFiles中:
processedFiles.append(文件)
f=打开(文件“r”)
行=f.读行()
f、 关闭()
时间。睡眠(延迟)
f=打开('myfile','a')
f、 写入(“%s\n”%lines)#python将\n转换为os.linesep
f、 close()#在大多数情况下,析构函数会调用它,因此可以忽略它
打印“%s:%s”%(线程名,time.ctime(time.time())
#创建两个线程,如下所示
尝试:
f=打开('myfile','r+'))
f、 截断()
start=timeit.default\u timer()
t1=线程(目标=打印时间,参数=(“线程-1”,0,))
t2=线程(目标=打印时间,参数=(“线程-2”,0,))
t1.start()
t2.start()
stop=timeit.default\u timer()
打印停止-启动
除:

打印“错误:无法启动线程”
您有几个问题,我马上就要解决,但一般来说,您的程序是磁盘绑定的(它不能比硬盘更快),所以即使是线程正确的程序也不能更快。由于文件系统缓存的原因,很难衡量磁盘性能:使用线程运行一次,然后以硬盘驱动器的速度运行,在没有线程的情况下再次运行,文件在系统中,因此运行速度非常快。当数据不再在系统缓存中时,很难确定代码以后将如何执行

现在来看看问题

如果文件不在processedFiles中:
不是线程安全的。两个线程都可以查看一个空列表并决定复制同一个文件。至少你需要一把锁。或者,您可以执行一次
glob
,然后将文件传递给线程读取的队列

逐行读取文件,然后加入
\n
是一种非常慢的文件写入方式。改为使用
shutil.copyfileobj
——它是用来高效复制文件的

f=open('myfile','a')
现在您有多个文件描述符指向一个文件,每个描述符将独立地推进其文件指针。。。。所以一个覆盖了另一个

f.write(“%s\n”%line)
也不是线程安全的。最终可能会导致输出文件中的文件位相互交错

stop=timeit.default\u timer()
-您没有等待线程完成其工作,因此没有真正测量任何有用的内容。代码严重不足报告执行时间


使用一个简单的单线程脚本会更好。

我马上就要谈到您有几个问题,但通常您的程序是磁盘绑定的(它不能比硬盘更快),所以即使是一个线程正确的程序也不会更快。由于文件系统缓存的原因,很难衡量磁盘性能:使用线程运行一次,然后以硬盘驱动器的速度运行,在没有线程的情况下再次运行,文件在系统中,因此运行速度非常快。当数据不再在系统缓存中时,很难确定代码以后将如何执行

现在来看看问题

如果文件不在processedFiles中:
不是线程安全的。两个线程都可以查看一个空列表并决定复制同一个文件。至少你需要一把锁。或者,您可以执行一次
glob
,然后将文件传递给线程读取的队列

逐行读取文件,然后加入
\n
是一种非常慢的文件写入方式。改为使用
shutil.copyfileobj
——它是用来高效复制文件的

f=open('myfile','a')
现在您有多个文件描述符指向一个文件,每个描述符将独立地推进其文件指针。。。。所以一个覆盖了另一个

f.write(“%s\n”%line)
也不是线程安全的。最终可能会导致输出文件中的文件位相互交错

stop=timeit.default\u timer()
-您没有等待线程完成其工作,因此没有真正测量任何有用的内容。代码严重不足报告执行时间


使用一个简单的单线程脚本会更好。

Python中的可能副本,更多线程!=更快。纯Python字节码不能同时运行,即使使用多个线程也不行。在Python中可能有重复的,更多线程!=更快。纯Python字节码不能并发运行,即使使用多个线程。