多处理的超时



我已经搜索了stackoverflow,尽管我在此发现了很多问题,但我没有找到适合我的情况的答案,也不适合我的情况,而不是强大的Python程序员来调整他们的答案满足我的需求。

我在这里无济于事:

在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()

做您想使用的一种方法是使用Process.join()方法接受的可选超时参数。这只会使其最多阻止调用线程。

我还设置了每个过程实例的daemon属性,以便您的主线程即使它启动的一个过程仍在"运行"(或已挂起(。

最后一点,您不需要multiprocessing.Lock来控制访问multiprocessing.Queue,因为它们会自动处理事物的那些方面,因此我将其删除。您可能仍然想拥有一个原因,例如控制对Stdout的访问,因此从各个过程中打印出来并不会重叠并弄乱屏幕的输出。

import multiprocessing
from multiprocessing import Process
import time
import datetime
def start_SAP():
    print 'opening SAP program'
### REPORTS IN SAP ###
def report_1(q):
    while True:  # logic to get shared queue
        if q.empty():
            time.sleep(1)
        else:
            k = q.get()
            time.sleep(1)
            break
    print 'report 1 finished'
def report_2(q):
    while True:  # logic to get shared queue
        if q.empty():
            time.sleep(1)
        else:
            k = q.get()
            time.sleep(1)
            break
    print 'report 2 finished'
def report_3(q):
    while True:  # logic to get shared queue
        if q.empty():
            time.sleep(1)
        else:
            k = q.get()
            time.sleep(60000) # Take longer than allotted time
            break
    print 'report 3 finished'

def report_N(q):
    while True:  # logic to get shared queue
        if q.empty():
            time.sleep(1)
        else:
            k = q.get()
            time.sleep(1)
            break
    print 'report N finished'
def close_SAP():
    print 'closing SAP'
def format_file():
    print 'formatting files'
def multi_daily_pull():
    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,))
    report1.daemon = True
    report2 = Process(target=report_2, args=(q,))
    report2.daemon = True
    report3 = Process(target=report_3, args=(q,))
    report3.daemon = True
    reportN = Process(target=report_N, args=(q,))
    reportN.daemon = True
    report1.start()
    report2.start()
    report3.start()
    reportN.start()
    report1.join(30)
    report2.join(30)
    report3.join(30)
    reportN.join(30)
    EndSAP = Process(target=close_SAP)
    EndSAP.start()
    EndSAP.join()
    formatfile = Process(target=format_file)
    formatfile .start()
    formatfile .join()
if __name__ == '__main__':
    multi_daily_pull()

相关内容

  • 没有找到相关文章

最新更新