我是一名php开发人员,正在尝试使用python多处理脚本。它创建的队列需要长达40,000多个项目。队列填充正常,但我的进程无声地随机死亡。尝试2.6和2.7。
我已经完成了日志记录以尝试诊断正在发生的事情,但无济于事。在没有可识别数据问题的随机条目上,所有子进程都将停止,主线程将退出?注意:无论起点如何,它都是失败的SAME条目,除非它被读取的条目少于20个。
有时会退出150个条目,有时会有50个条目。因为我需要它做40k,这是一个交易破坏者。该脚本在20个左右时没有问题,并记录正确的进程启动和退出消息。如果失败,则不会记录进程退出。
我的代码对post非常敏感,但这里是我使用的基本模型,取自多线程教程并转换为mutliprocessing模块。基本上,只需用“多处理”替换“线程”,并使用多处理的队列而不是模块队列。
import Queue
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, q):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.q = q
def run(self):
print "Starting " + self.name
process_data(self.name, self.q)
print "Exiting " + self.name
def process_data(threadName, q):
while not exitFlag:
queueLock.acquire()
if not workQueue.empty():
data = q.get()
queueLock.release()
print "%s processing %s" % (threadName, data)
else:
queueLock.release()
time.sleep(1)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = Queue.Queue(10)
threads = []
threadID = 1
# Create new threads
for tName in threadList:
thread = myThread(threadID, tName, workQueue)
thread.start()
threads.append(thread)
threadID += 1
# Fill the queue
queueLock.acquire()
for word in nameList:
workQueue.put(word)
queueLock.release()
# Wait for queue to empty
while not workQueue.empty():
pass
# Notify threads it's time to exit
exitFlag = 1
# Wait for all threads to complete
for t in threads:
t.join()
print "Exiting Main Thread"
答案 0 :(得分:1)
事实证明,我在64位Windows机器上意外安装了32位python。随之而来的是奇怪的行为,主要来自多处理模块。卸载32位并安装64位python 2.7.10使其正常工作。
因此,如果您的代码执行方式没有任何意义,那么您可能会得到错误的解释器!