Python 多线程以计算文件中字符的重复出现次数

Python 多线程以计算文件中字符的重复出现次数,python,Python,我试图在Python中使用多线程,以便遍历一个大的文本文件(字符),并计算相同字符的重复出现次数 如何设置它,以便使用上述方法处理多个线程并处理一个文件以计算字符的重复出现次数?这里有三个问题 您的程序尝试同时在多个线程中读取同一物理文件。这毫无意义,在操作系统或硬件级别上可能不可行。可行的方法是首先在主线程中将整个文件读入几个字符串,然后在多个线程中对字符串(而不是文件)进行操作 第二个问题是,您从计数器返回一个值,但是返回的值没有地方可去。没有来电。没有从一个线程向另一个线程“返回”值的概念

我试图在Python中使用多线程,以便遍历一个大的文本文件(字符),并计算相同字符的重复出现次数


如何设置它,以便使用上述方法处理多个线程并处理一个文件以计算字符的重复出现次数?

这里有三个问题

您的程序尝试同时在多个线程中读取同一物理文件。这毫无意义,在操作系统或硬件级别上可能不可行。可行的方法是首先在主线程中将整个文件读入几个字符串,然后在多个线程中对字符串(而不是文件)进行操作

第二个问题是,您从计数器返回一个值,但是返回的值没有地方可去。没有来电。没有从一个线程向另一个线程“返回”值的概念。相反,线程必须将该值存储在某个地方,然后主线程中的代码可以访问该值。一个快速而肮脏的解决方案是创建一个列表并向每个线程传递一个索引。完成后,它使用索引将结果填充到列表中

第三个问题是,您必须等待线程完成。线程有一个.join()函数用于此目的。只有在所有线程完成后,才能打印所有计数的总和


这对你来说可能是一个有用的学习练习,但肯定比在一个线程中完成整个任务要慢。当您必须等待某个事件发生,并且同时希望在其他任务上取得进展时,线程是很有价值的。对于简单的数字处理,线程没有任何优势(对于多处理来说是如此)。

这里有三个问题

您的程序尝试同时在多个线程中读取同一物理文件。这毫无意义,在操作系统或硬件级别上可能不可行。可行的方法是首先在主线程中将整个文件读入几个字符串,然后在多个线程中对字符串(而不是文件)进行操作

第二个问题是,您从计数器返回一个值,但是返回的值没有地方可去。没有来电。没有从一个线程向另一个线程“返回”值的概念。相反,线程必须将该值存储在某个地方,然后主线程中的代码可以访问该值。一个快速而肮脏的解决方案是创建一个列表并向每个线程传递一个索引。完成后,它使用索引将结果填充到列表中

第三个问题是,您必须等待线程完成。线程有一个.join()函数用于此目的。只有在所有线程完成后,才能打印所有计数的总和


这对你来说可能是一个有用的学习练习,但肯定比在一个线程中完成整个任务要慢。当您必须等待某个事件发生,并且同时希望在其他任务上取得进展时,线程是很有价值的。对于简单的数字处理,线程没有任何优势(对于多处理来说也是如此)。

不建议在单个文件上使用多个线程,相反,您可以先将内容保存到字符串中,然后将其分成相等的部分

我鼓励您使用从
threading.Thread
派生的helper类,这样每个线程都可以有自己的计数器

代码示例
导入线程
类计数器(threading.Thread):
定义初始化(self、text、char):
super()。\uuuu init\uuuuu()
self.counter=0
self.text=文本
self.char=char
def运行(自):
对于self.text中的c:
如果c==self.char:
self.counter+=1
如果名称=“\uuuuu main\uuuuuuuu”:
char=“a”
线程数=3
线程=[]
计数器=0
#在使用线程之前读取文件以避免IO错误
file=open(“my_file.txt”、“r”)
text=file.read()
#将文本拆分为与线程数相等的部分
parts=[text[i:i+u线程数]表示范围内的i(0,len(text),u线程数)]
#为每个零件创建并启动一个螺纹
对于部分中的部分:
线程=计数器(部分,字符)
thread.start()
附加(线程)
#加入你的线程并收集它们的编号
对于线程中的线程:
thread.join()
计数器+=线程计数器
打印(计数器)

不建议在单个文件上使用多个线程,相反,您可以先将内容保存到字符串中,然后将其拆分为相等的部分

我鼓励您使用从
threading.Thread
派生的helper类,这样每个线程都可以有自己的计数器

代码示例
导入线程
类计数器(threading.Thread):
定义初始化(self、text、char):
super()。\uuuu init\uuuuu()
self.counter=0
self.text=文本
self.char=char
def运行(自):
对于self.text中的c:
如果c==self.char:
self.counter+=1
如果名称=“\uuuuu main\uuuuuuuu”:
char=“a”
线程数=3
线程=[]
计数器=0
#在使用线程之前读取文件以避免IO错误
file=open(“my_file.txt”、“r”)
text=file.read()
#将文本拆分为与线程数相等的部分
parts=[text[i:i+u线程数]表示范围内的i(0,len(text),u线程数)]
#为每个零件创建并启动一个螺纹
对于部分中的部分:
线程=计数器(部分,字符)
thread.start()
附加(线程)
#加入你的线程并收集它们的编号
对于线程中的线程:
thread.join()
计数器+=线程计数器
打印(计数器)

这是一个I/O绑定任务。多线程或多处理不太可能加快速度。您的代码倾向于在位置0处打开文件,并一次读取1个字符。。。我看不出它是如何在文件中跳跃的。但是