<p>这里有一个示例解决方案供您参考。您可以在这里使用decorator来修饰任何要设置超时的函数</p>
<pre><code>from datetime import datetime, timezone
import multiprocessing
import time
def timeout(seconds):
def decorator(func):
def wrapper(*args, **kwargs):
response = multiprocessing.Manager().dict()
proc = multiprocessing.Process(target=func, args=(*args, response), kwargs=kwargs)
proc.start()
start = time.time()
while (time.time() - start) < seconds and proc.is_alive():
pass
if proc.is_alive():
print(f"Process is not finished after {seconds} seconds. Terminating...")
proc.terminate()
proc.join()
return dict(response)
return wrapper
return decorator
@timeout(10)
def scan_nfc_card(card_name, response):
# If you need to return anything from the function with a timeout, use the response dictionary.
response['counter'] = 0
while True:
response['counter'] += 1
print(f"Waiting for NFC card {card_name} to be scanned...")
time.sleep(1)
print(f"[{datetime.now(timezone.utc)}] Start first process")
response = scan_nfc_card("card-ABC")
print(f"{response=}")
print(f"[{datetime.now(timezone.utc)}] Continue other processes")
</code></pre>
<p>输出:</p>
<pre><code>$ python3 script.py
[2021-09-02 10:23:50.475114+00:00] Start first process
Waiting for NFC card card-ABC to be scanned...
Waiting for NFC card card-ABC to be scanned...
Waiting for NFC card card-ABC to be scanned...
Waiting for NFC card card-ABC to be scanned...
Waiting for NFC card card-ABC to be scanned...
Waiting for NFC card card-ABC to be scanned...
Waiting for NFC card card-ABC to be scanned...
Waiting for NFC card card-ABC to be scanned...
Waiting for NFC card card-ABC to be scanned...
Waiting for NFC card card-ABC to be scanned...
Process is not finished after 10 seconds. Terminating...
response={'counter': 10}
[2021-09-02 10:24:00.502205+00:00] Continue other processes
</code></pre>
<ul>
<li>如您所见,函数达到了10秒的超时时间</李>
</ul>
<p>比如说NFC扫描马上就成功了</p>
<pre><code>@timeout(10)
def scan_nfc_card(card_name, response):
response['counter'] = 0
while True:
response['counter'] += 1
print("Waiting for NFC card to be scanned...")
break # Break right away
</code></pre>
<p>输出:</p>
<pre><code>$ python3 script.py
[2021-09-02 10:23:43.343436+00:00] Start first process
Waiting for NFC card card-ABC to be scanned...
response={'counter': 1}
[2021-09-02 10:23:43.385748+00:00] Continue other processes
</code></pre>
<ul>
<li>现在,函数立即结束</李>
</ul>