Hướng dẫn python waiting wait - trăn chờ đợi

57

Nội dung chính ShowShow

  • Làm thế nào chờ đợi cho đến khi một điều kiện được đáp ứng trong Python?
  • Làm thế nào để bạn làm cho Python đợi cho đến khi?
  • Có một lệnh chờ trong Python?
  • Làm thế nào trong khi làm việc thực sự trong Python?

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.Learn more.
Learn more.

Tôi cần phải đợi trong một kịch bản cho đến khi một số điều kiện nhất định trở thành sự thật?

Tôi biết tôi có thể tự mình thực hiện sự kiện của mình bằng các biến điều kiện và bạn bè, nhưng tôi không muốn trải qua tất cả những rắc rối khi thực hiện nó, vì một số thay đổi thuộc tính đối tượng đến từ luồng bên ngoài trong thư viện C ++ được bọc (Boost.Python), Vì vậy, tôi không thể chiếm quyền điều khiển

import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
5 trong một lớp và đặt một biến điều kiện ở đó, khiến tôi cố gắng tạo và báo hiệu một biến điều kiện trăn từ C ++ hoặc bọc một bản địa và chờ nó trong Python, cả hai Âm thanh khó hiểu, không cần thiết phải phức tạp và nhàm chán.

Có một cách nào dễ dàng hơn để làm điều đó, ngăn chặn việc bỏ phiếu liên tục điều kiện?

Lý tưởng nhất là nó sẽ nằm dọc theo dòng

res = wait_until(lambda: some_predicate, timeout)
if (not res):
    print 'timed out'

Khi được hỏi ngày 7 tháng 5 năm 2010 lúc 2:33May 7, 2010 at 2:33May 7, 2010 at 2:33

Hướng dẫn python waiting wait - trăn chờ đợi

Thật không may, khả năng duy nhất để đáp ứng các ràng buộc của bạn là thăm dò định kỳ, ví dụ ....:

import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False

hoặc những thứ tương tự. Điều này có thể được tối ưu hóa theo nhiều cách nếu

import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
6 có thể bị phân tách (ví dụ: nếu nó được biết là
import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
7 của một số điều khoản, đặc biệt là nếu một số điều khoản lần lượt được tối ưu hóa bằng cách phát hiện qua
import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
8 hoặc bất cứ điều gì, v.v.) Nhưng trong các thuật ngữ chung mà bạn yêu cầu, cách tiếp cận không hiệu quả này là lối thoát duy nhất.

Mariusz Jamro

29.7K24 Huy hiệu vàng111 Huy hiệu bạc153 Huy hiệu đồng24 gold badges111 silver badges153 bronze badges24 gold badges111 silver badges153 bronze badges

Đã trả lời ngày 7 tháng 5 năm 2010 lúc 2:57May 7, 2010 at 2:57May 7, 2010 at 2:57

Alex Martellialex MartelliAlex MartelliAlex Martelli

827K163 Huy hiệu vàng1204 Huy hiệu bạc1383 Huy hiệu Đồng163 gold badges1204 silver badges1383 bronze badges163 gold badges1204 silver badges1383 bronze badges

4

Một gói đẹp khác là

import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
9 - https://pypi.org/project/waiting/

install:

pip install waiting

Cách sử dụng: Bạn vượt qua một hàm sẽ được gọi mỗi lần là điều kiện, thời gian chờ và (điều này rất hữu ích) bạn có thể vượt qua mô tả cho sự chờ đợi, sẽ được hiển thị nếu bạn nhận được thời gian.

sử dụng chức năng:

from waiting import wait


def is_something_ready(something):
    if something.ready():
        return True
    return False


# wait for something to be ready
something = # whatever

wait(lambda: is_something_ready(something), timeout_seconds=120, waiting_for="something to be ready")

# this code will only execute after "something" is ready
print("Done")

Lưu ý: Hàm phải trả về Boolean - Đúng khi chờ đợi kết thúc, sai nếu không

Đã trả lời ngày 17 tháng 12 năm 2019 lúc 7:23Dec 17, 2019 at 7:23Dec 17, 2019 at 7:23

3

Đây là một giải pháp khác. Mục tiêu là thực hiện các chủ đề để chờ đợi nhau trước khi thực hiện một số công việc theo thứ tự rất chính xác. Công việc có thể mất thời gian không xác định. Bỏ phiếu liên tục không tốt vì hai lý do: nó ăn thời gian CPU và hành động không bắt đầu ngay sau khi điều kiện được đáp ứng.

class Waiter():

    def __init__(self, init_value):
        self.var = init_value
        self.var_mutex = threading.Lock()
        self.var_event = threading.Event()

    def WaitUntil(self, v):
        while True:
            self.var_mutex.acquire()
            if self.var == v:
                self.var_mutex.release()
                return # Done waiting
            self.var_mutex.release()
            self.var_event.wait(1) # Wait 1 sec

    def Set(self, v):
        self.var_mutex.acquire()
        self.var = v
        self.var_mutex.release()
        self.var_event.set() # In case someone is waiting
        self.var_event.clear()

Và cách để kiểm tra nó

res = wait_until(lambda: some_predicate, timeout)
if (not res):
    print 'timed out'
0

Người phục vụ cho đa xử lý:

res = wait_until(lambda: some_predicate, timeout)
if (not res):
    print 'timed out'
1

Hãy bình luận nếu đây vẫn không phải là giải pháp tốt nhất.

Đã trả lời ngày 25 tháng 5 năm 2020 lúc 16:05May 25, 2020 at 16:05May 25, 2020 at 16:05

AlexalexAlexAlex

811 Huy hiệu bạc2 Huy hiệu đồng1 silver badge2 bronze badges1 silver badge2 bronze badges

2

Về cơ bản, bạn đã trả lời câu hỏi của riêng bạn: Không.

Vì bạn đang xử lý các thư viện bên ngoài trong Boost.Python, có thể thay đổi các đối tượng khi giải trí, bạn cần phải có những thói quen đó gọi một trình xử lý sự kiện làm mới hoặc làm việc với một điều kiện.

Đã trả lời ngày 7 tháng 5 năm 2010 lúc 2:36May 7, 2010 at 2:36May 7, 2010 at 2:36

Yann Raminyann RaminYann RaminYann Ramin

32,7k3 huy hiệu vàng57 Huy hiệu bạc81 Huy hiệu đồng3 gold badges57 silver badges81 bronze badges3 gold badges57 silver badges81 bronze badges

Đây là sự mở rộng luồng cho giải pháp của Alex:

res = wait_until(lambda: some_predicate, timeout)
if (not res):
    print 'timed out'
2

Đã trả lời ngày 4 tháng 8 năm 2017 lúc 4:16Aug 4, 2017 at 4:16Aug 4, 2017 at 4:16

Kavaklıoğlucan KavaklıoğluCan KavaklıoğluCan Kavaklıoğlu

4871 Huy hiệu vàng7 Huy hiệu bạc12 Huy hiệu đồng1 gold badge7 silver badges12 bronze badges1 gold badge7 silver badges12 bronze badges

Từ góc độ tính toán, đôi khi phải có một kiểm tra cho tất cả các điều kiện ở đâu đó. Nếu bạn có hai phần mã, một phần tạo ra các thay đổi điều kiện và phần còn lại nên được thực thi khi một số là đúng, bạn có thể thực hiện như sau:

Có mã thay đổi các điều kiện, giả sử, chủ đề chính và mã nên được khởi chạy khi một số điều kiện là đúng, trong một luồng công nhân.

res = wait_until(lambda: some_predicate, timeout)
if (not res):
    print 'timed out'
3

Để biết thêm thông tin liên quan đến phương pháp này, hãy truy cập: https://docs.python.org/3/l Library/threading.html#event-objects

Đã trả lời ngày 27 tháng 5 năm 2021 lúc 22:42May 27, 2021 at 22:42May 27, 2021 at 22:42

Giải pháp đề xuất:

res = wait_until(lambda: some_predicate, timeout)
if (not res):
    print 'timed out'
4

Cách sử dụng:

import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
0

Asclepius

52.5K16 Huy hiệu vàng153 Huy hiệu bạc134 Huy hiệu đồng16 gold badges153 silver badges134 bronze badges16 gold badges153 silver badges134 bronze badges

Đã trả lời ngày 9 tháng 7 năm 2019 lúc 17:11Jul 9, 2019 at 17:11Jul 9, 2019 at 17:11

Tôi đã sử dụng nó trong mã của mình:

import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
1

Hi vọng điêu nay co ich

Đã trả lời ngày 29 tháng 8 lúc 14:12Aug 29 at 14:12Aug 29 at 14:12

Điều này làm việc cho tôi

import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
2

Điều này là để chờ tín hiệu trong khi đảm bảo giới hạn thời gian là 1 giây

Yamaneko

3.3232 Huy hiệu vàng36 Huy hiệu bạc56 Huy hiệu Đồng2 gold badges36 silver badges56 bronze badges2 gold badges36 silver badges56 bronze badges

Đã trả lời ngày 2 tháng 2 năm 2019 lúc 9:37Feb 2, 2019 at 9:37Feb 2, 2019 at 9:37

Đây là cách:

import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
3

Đã trả lời ngày 28 tháng 6 năm 2021 lúc 21:29Jun 28, 2021 at 21:29Jun 28, 2021 at 21:29

1

Đây là mã của tôi tôi đã sử dụng trong một trong các dự án của tôi:

import time

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs):
  mustend = time.time() + timeout
  while time.time() < mustend:
    if somepredicate(*args, **kwargs): return True
    time.sleep(period)
  return False
4

Hy vọng nó giúp

Đã trả lời ngày 15 tháng 3 năm 2020 lúc 10:05Mar 15, 2020 at 10:05Mar 15, 2020 at 10:05

Làm thế nào chờ đợi cho đến khi một điều kiện được đáp ứng trong Python?

Chờ () kỹ thuật. Hàm Chờ () này thường được sử dụng để chờ đợi bất cứ điều gì xảy ra trong một quy trình và nó sẽ xếp hàng cho đến khi hàm được gọi đúng với các điều kiện hoặc chế độ nhất định được chỉ định. Hàm chờ () được xác định trong hai mô -đun riêng biệt trong Python.. This wait() function is often used to wait for anything to happen in a process, and it will stand in line until the function is invoked true with certain conditions or modes specified. The wait() function is defined in two separate modules in Python.. This wait() function is often used to wait for anything to happen in a process, and it will stand in line until the function is invoked true with certain conditions or modes specified. The wait() function is defined in two separate modules in Python.

Làm thế nào để bạn làm cho Python đợi cho đến khi?

Thêm một cuộc gọi Python Sleep () với Time.s ngủ () Mô -đun thời gian có một hàm ngủ () mà bạn có thể sử dụng để đình chỉ thực thi chuỗi gọi trong nhiều giây bạn chỉ định.Nếu bạn chạy mã này trong bảng điều khiển của mình, thì bạn nên trải nghiệm độ trễ trước khi bạn có thể nhập một câu lệnh mới trong bản phát hành. The time module has a function sleep() that you can use to suspend execution of the calling thread for however many seconds you specify. If you run this code in your console, then you should experience a delay before you can enter a new statement in the REPL. The time module has a function sleep() that you can use to suspend execution of the calling thread for however many seconds you specify. If you run this code in your console, then you should experience a delay before you can enter a new statement in the REPL.

Có một lệnh chờ trong Python?

Python Sleep () là một hàm được sử dụng để trì hoãn việc thực thi mã trong số giây được đưa ra làm đầu vào cho giấc ngủ ().Lệnh ngủ () là một phần của mô -đun thời gian.Bạn có thể sử dụng hàm Sleep () để tạm thời tạm dừng việc thực thi mã của bạn.

Làm thế nào trong khi làm việc thực sự trong Python?

Trong khi vòng lặp được sử dụng để thực thi một khối mã liên tục cho đến khi điều kiện boolean được đánh giá là sai.Nếu chúng ta viết trong khi đúng thì vòng lặp sẽ chạy mãi mãi.If we write while True then the loop will run forever.If we write while True then the loop will run forever.