python multiprocessing queue_python-Multiprocessing Queue.get()挂起

我正在尝试实现基本的多处理,但是遇到了一个问题. python脚本附在下面.

import time, sys, random, threading

from multiprocessing import Process

from Queue import Queue

from FrequencyAnalysis import FrequencyStore, AnalyzeFrequency

append_queue = Queue(10)

database = FrequencyStore()

def add_to_append_queue(_list):

append_queue.put(_list)

def process_append_queue():

while True:

item = append_queue.get()

database.append(item)

print("Appended to database in %.4f seconds" % database.append_time)

append_queue.task_done()

return

def main():

database.load_db()

print("Database loaded in %.4f seconds" % database.load_time)

append_queue_process = Process(target=process_append_queue)

append_queue_process.daemon = True

append_queue_process.start()

#t = threading.Thread(target=process_append_queue)

#t.daemon = True

#t.start()

while True:

path = raw_input("file: ")

if path == "exit":

break

a = AnalyzeFrequency(path)

a.analyze()

print("Analyzed file in %.4f seconds" % a._time)

add_to_append_queue(a.get_results())

append_queue.join()

#append_queue_process.join()

database.save_db()

print("Database saved in %.4f seconds" % database.save_time)

sys.exit(0)

if __name__=="__main__":

main()

AnalyzeFrequency分析文件中单词的频率,并且get_results()返回所述单词和频率的排序列表.该列表非常大,可能有10000个项目.

然后将此列表传递到add_to_append_queue方法,该方法将其添加到队列中. process_append_queue一个接一个地获取项目,并将频率添加到“数据库”中.此操作所需的时间比main()中的实际分析时间长一些,因此我尝试为此方法使用单独的过程.当我尝试使用线程模块执行此操作时,一切工作都很好,没有错误.当我尝试使用Process时,脚本会挂在item = append_queue.get()处.

有人可以解释一下这里发生了什么,也许可以指导我解决问题?

所有答案表示赞赏!

UPDATE

泡菜错误是我的错,这只是一个错字.现在,我在多重处理中使用Queue类,但是append_queue.get()方法仍然挂起.

新密码

import time, sys, random

from multiprocessing import Process, Queue

from FrequencyAnalysis import FrequencyStore, AnalyzeFrequency

append_queue = Queue()

database = FrequencyStore()

def add_to_append_queue(_list):

append_queue.put(_list)

def process_append_queue():

while True:

database.append(append_queue.get())

print("Appended to database in %.4f seconds" % database.append_time)

return

def main():

database.load_db()

print("Database loaded in %.4f seconds" % database.load_time)

append_queue_process = Process(target=process_append_queue)

append_queue_process.daemon = True

append_queue_process.start()

#t = threading.Thread(target=process_append_queue)

#t.daemon = True

#t.start()

while True:

path = raw_input("file: ")

if path == "exit":

break

a = AnalyzeFrequency(path)

a.analyze()

print("Analyzed file in %.4f seconds" % a._time)

add_to_append_queue(a.get_results())

#append_queue.join()

#append_queue_process.join()

print str(append_queue.qsize())

database.save_db()

print("Database saved in %.4f seconds" % database.save_time)

sys.exit(0)

if __name__=="__main__":

main()

更新2

这是数据库代码:

class FrequencyStore:

def __init__(self):

self.sorter = Sorter()

self.db = {}

self.load_time = -1

self.save_time = -1

self.append_time = -1

self.sort_time = -1

def load_db(self):

start_time = time.time()

try:

file = open("results.txt", 'r')

except:

raise IOError

self.db = {}

for line in file:

word, count = line.strip("

").split("=")

self.db[word] = int(count)

file.close()

self.load_time = time.time() - start_time

def save_db(self):

start_time = time.time()

_db = []

for key in self.db:

_db.append([key, self.db[key]])

_db = self.sort(_db)

try:

file = open("results.txt", 'w')

except:

raise IOError

file.truncate(0)

for x in _db:

file.write(x[0] + "=" + str(x[1]) + "

")

file.close()

self.save_time = time.time() - start_time

def create_sorted_db(self):

_temp_db = []

for key in self.db:

_temp_db.append([key, self.db[key]])

_temp_db = self.sort(_temp_db)

_temp_db.reverse()

return _temp_db

def get_db(self):

return self.db

def sort(self, _list):

start_time = time.time()

_list = self.sorter.mergesort(_list)

_list.reverse()

self.sort_time = time.time() - start_time

return _list

def append(self, _list):

start_time = time.time()

for x in _list:

if x[0] not in self.db:

self.db[x[0]] = x[1]

else:

self.db[x[0]] += x[1]

self.append_time = time.time() - start_time

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值