簡體   English   中英

構建一種等待其他 python 腳本輸入的自運行隊列腳本

[英]Building sone kind of self running que-script waiting for other python scripts inputs

我有一個問題,從我的角度來看,這是某種特殊的問題。

我正在運行一個系統(不可更改),該系統同時運行相同的 Python 腳本 10-100 次。 不是所有的時間,但當它這樣做時,比一次。

實際上,在完全相同的時刻(或僅延遲幾毫秒)執行 x 次的此腳本需要向 Web API 詢問某些數據。 這個 Web API 不能一次處理那么多請求(我也不能改變,也不能以任何方式修改這個 API)。

所以我想要構建的是某種單獨的 python 腳本,它一直運行並等待所有其他腳本的輸入。 這個單獨的腳本應該接收 API 的請求負載,然后創建一個隊列並獲取所有數據。 在此之后,將數據返回給請求數據的 python 腳本。

這有可能嗎? 有人甚至可以理解我的問題嗎? 對不起我的復雜描述:D

實際上,我在一個多次執行的腳本中解決了這個問題,在這些腳本執行 API 請求之前,它們會暫停 rng(x) 毫秒,因此它們不會一次執行所有請求 - 但這個解決方案不是真的萬無一失。

對於我的問題,也許有比我的第一個想法更好的解決方案。

謝謝你的幫助!

fcntl.flock - 如何實現超時?

此命令盡可能快地執行 python 腳本的 5 個實例,然后等待命令等待所有后台進程完成。

for ((i=0;i<5;i++)) ; do ./same-lock.py &  done ; wait
[1] 66023
[2] 66024
[3] 66025
[4] 66026
[5] 66027
66025
66027
66024
66026
66023
[1]   Done                    ./same-lock.py
[2]   Done                    ./same-lock.py
[3]   Done                    ./same-lock.py
[4]-  Done                    ./same-lock.py
[5]+  Done                    ./same-lock.py

下面的 python 代碼確保一次只運行其中一個腳本。

#!/usr/local/bin/python3

# same-lock.py

import os
from random import randint
from time import sleep
import signal, errno
from contextlib import contextmanager
import fcntl

lock_file = '/tmp/same.lock_file'

@contextmanager
def timeout(seconds):
    def timeout_handler(signum, frame):
        pass

    original_handler = signal.signal(signal.SIGALRM, timeout_handler)

    try:
        signal.alarm(seconds)
        yield
    finally:
        signal.alarm(0)
        signal.signal(signal.SIGALRM, original_handler)


# wait up to 600 seconds for a lock
with timeout(600):
    f = open(lock_file, "w")
    try:
        fcntl.flock(f.fileno(), fcntl.LOCK_EX)
        # Print the process ID of the current process
        pid = os.getpid()
        print(pid)
        # Sleep a random number of seconds (between 1 and 5)
        sleep(randint(1,5))
        fcntl.flock(f.fileno(), fcntl.LOCK_UN)
    except IOError as e:
        if e.errno != errno.EINTR:
            raise e
        print( "Lock timed out")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM