更新:在dano的帮助下,我解决了这个问题。如何在多处理进程完成后退出python脚本?
我没有调用生产者join()
,它使我的脚本挂起。 只需要添加一个行达诺说:
...
producer = multiprocessing.Process(target=produce,args=(file_queue,row_queue))
producer.daemon = True
producer.start()
...
旧脚本:
import multiprocessing
import Queue
QUEUE_SIZE = 2000
def produce(file_queue, row_queue,):
while not file_queue.empty():
src_file = file_queue.get()
zip_reader = gzip.open(src_file, 'rb')
try:
csv_reader = csv.reader(zip_reader, delimiter=SDP_DELIMITER)
for row in csv_reader:
new_row = process_sdp_row(row)
if new_row:
row_queue.put(new_row)
finally:
zip_reader.close()
def consume(row_queue):
'''processes all rows, once queue is empty, break the infinit loop'''
while True:
try:
# takes a row from queue and process it
pass
except multiprocessing.TimeoutError as toe:
print "timeout, all rows have been processed, quit."
break
except Queue.Empty:
print "all rows have been processed, quit."
break
except Exception as e:
print "critical error"
print e
break
def main(args):
file_queue = multiprocessing.Queue()
row_queue = multiprocessing.Queue(QUEUE_SIZE)
file_queue.put(file1)
file_queue.put(file2)
file_queue.put(file3)
# starts 3 producers
for i in xrange(4):
producer = multiprocessing.Process(target=produce,args=(file_queue,row_queue))
producer.start()
# starts 1 consumer
consumer = multiprocessing.Process(target=consume,args=(row_queue,))
consumer.start()
# blocks main thread until consumer process finished
consumer.join()
# prints statistics results after consumer is done
sys.exit(0)
if __name__ == "__main__":
main(sys.argv[1:])
目的:
我使用python 2.7
multiprocessing
生成3个生产者读取3个文件的同时,然后将文件行放入row_queue
中,并生成1位消费者对所有行执行更多处理。打印统计结果在消费者完成后在主线程中产生,所以我使用join()
方法。最后调用sys.exit(0)
来退出脚本。
问题: 无法退出脚本。
我试图用print "the end"
代替sys.exit(0)
,在控制台上显示“结束”。难道我做错了什么?为什么脚本不会退出,以及如何让它退出?由于
这里没有足够的信息可以肯定地说,但最可能的问题是一个或多个'Producer'进程仍在运行。尝试通过在调用'producer之前添加'producer.daemon = True'来使它们守护进程。start()',看脚本是否会退出。 – dano 2015-04-02 16:35:11
或者,为每个生产者调用'join()'以及...假设它们通常会终止。 – twalberg 2015-04-02 16:40:13
@twalberg如果它们最终结束,脚本将不需要调用'join()'而退出。当解释器退出时,Python隐式地在非守护进程子进程上调用join()。 – dano 2015-04-02 16:41:34