【发布时间】:2018-07-29 23:01:14
【问题描述】:
我搜索了 StackOverflow,虽然我发现了很多关于此的问题,但我还没有找到适合我情况的答案/不是一个强大的 Python 程序员来调整他们的答案以满足我的需要。
我看这里无济于事:
kill a function after a certain time in windows
Python: kill or terminate subprocess when timeout
signal.alarm replacement in Windows [Python]
我正在使用多处理同时运行多个 SAP 窗口以提取报告。设置为按计划每 5 分钟运行一次。每隔一段时间,其中一个报告就会由于 GUI 界面而停滞不前,而且永远不会结束。我没有收到错误或异常,它只是永远停止。我想要的是有一个超时功能,在这部分在 SAP 中执行的代码期间,如果它需要超过 4 分钟,它会超时,关闭 SAP,跳过其余代码,并等待下一个计划报告时间。
我使用的是 Windows Python 2.7
import multiprocessing
from multiprocessing import Manager, Process
import time
import datetime
### OPEN SAP ###
def start_SAP():
print 'opening SAP program'
### REPORTS IN SAP ###
def report_1(q, lock):
while True: # logic to get shared queue
if not q.empty():
lock.acquire()
k = q.get()
time.sleep(1)
lock.release()
break
else:
time.sleep(1)
print 'running report 1'
def report_2(q, lock):
while True: # logic to get shared queue
if not q.empty():
lock.acquire()
k = q.get()
time.sleep(1)
lock.release()
break
else:
time.sleep(1)
print 'running report 2'
def report_3(q, lock):
while True: # logic to get shared queue
if not q.empty():
lock.acquire()
k = q.get()
time.sleep(1)
lock.release()
break
else:
time.sleep(1)
time.sleep(60000) #mimicking the stall for report 3 that takes longer than allotted time
print 'running report 3'
def report_N(q, lock):
while True: # logic to get shared queue
if not q.empty():
lock.acquire()
k = q.get()
time.sleep(1)
lock.release()
break
else:
time.sleep(1)
print 'running report N'
### CLOSES SAP ###
def close_SAP():
print 'closes SAP'
def format_file():
print 'formatting files'
def multi_daily_pull():
lock = multiprocessing.Lock() # creating a lock in multiprocessing
shared_list = range(6) # creating a shared list for all functions to use
q = multiprocessing.Queue() # creating an empty queue in mulitprocessing
for n in shared_list: # putting list into the queue
q.put(n)
print 'Starting process at ', time.strftime('%m/%d/%Y %H:%M:%S')
print 'Starting SAP Pulls at ', time.strftime('%m/%d/%Y %H:%M:%S')
StartSAP = Process(target=start_SAP)
StartSAP.start()
StartSAP.join()
report1= Process(target=report_1, args=(q, lock))
report2= Process(target=report_2, args=(q, lock))
report3= Process(target=report_3, args=(q, lock))
reportN= Process(target=report_N, args=(q, lock))
report1.start()
report2.start()
report3.start()
reportN.start()
report1.join()
report2.join()
report3.join()
reportN.join()
EndSAP = Process(target=close_SAP)
EndSAP.start()
EndSAP.join()
formatfile = Process(target=format_file)
formatfile .start()
formatfile .join()
if __name__ == '__main__':
multi_daily_pull()
【问题讨论】:
-
嗨@martineau,我已经更新了代码。如果您需要任何进一步的说明,请告诉我!
-
甚至没有接近...您的代码仍然远非最小。一方面,其中未使用的
imports 比实际需要的要多。另外,schedule模块是什么?您需要发布足够多的代码才能运行和重现问题(但仅此而已)。 -
@martineau 抱歉,我只是在复制我的代码,我已经删除了未使用的
imports和不必要的类文件。运行代码时,您将看到在第 5 分钟间隔(从 0:00 开始),代码将运行。它将运行报告 1,2 和 N,但不会完成报告 3 的运行。它停止了(我通过长时间使用 sleep 来模仿这一点)。我需要找到一种方法来确定 X 分钟后结束代码运行,运行 close_SAP 函数,并等待下一次计划运行。
标签: python windows python-2.7 timeout multiprocessing