Chủ đề Selenium Python có an toàn không?

Trong chương này, chúng ta sẽ tìm hiểu cách kiểm soát quyền truy cập vào các tài nguyên được chia sẻ. Việc kiểm soát là cần thiết để ngăn chặn tham nhũng của dữ liệu. Nói cách khác, để bảo vệ chống truy cập đồng thời vào một đối tượng, chúng ta cần sử dụng một đối tượng Khóa

Khóa nguyên thủy là nguyên thủy đồng bộ hóa không thuộc sở hữu của một luồng cụ thể khi bị khóa. Trong Python, nó hiện là nguyên mẫu đồng bộ hóa mức thấp nhất hiện có, được triển khai trực tiếp bởi mô-đun mở rộng _thread
- https. // tài liệu. con trăn. org/3/library/luồng. html

Khóa nguyên thủy ở một trong hai trạng thái, "đã khóa" hoặc "đã mở khóa". Nó được tạo ở trạng thái mở khóa. Nó có hai phương thức cơ bản, thu được() và phát hành(). Khi trạng thái được mở khóa, thu được () sẽ thay đổi trạng thái thành bị khóa và quay lại ngay lập tức. Khi trạng thái bị khóa, lệnh thu thập () sẽ chặn cho đến khi lệnh gọi giải phóng () trong một chuỗi khác thay đổi trạng thái đó thành mở khóa, sau đó lệnh gọi thu thập () đặt lại thành bị khóa và trả về. Phương thức release() chỉ nên được gọi ở trạng thái bị khóa; . Nếu một nỗ lực được thực hiện để giải phóng một khóa đã mở khóa, RuntimeError sẽ được nâng lên

Đây là mã ví dụ của chúng tôi bằng cách sử dụng đối tượng Khóa. Trong mã, hàm worker() tăng một phiên bản Bộ đếm, quản lý Khóa để ngăn hai luồng thay đổi trạng thái bên trong của nó cùng một lúc

import threading
import time
import logging
import random

logging.basicConfig(level=logging.DEBUG,
                    format='(%(threadName)-9s) %(message)s',)
                    
class Counter(object):
    def __init__(self, start = 0):
        self.lock = threading.Lock()
        self.value = start
    def increment(self):
        logging.debug('Waiting for a lock')
        self.lock.acquire()
        try:
            logging.debug('Acquired a lock')
            self.value = self.value + 1
        finally:
            logging.debug('Released a lock')
            self.lock.release()

def worker(c):
    for i in range(2):
        r = random.random()
        logging.debug('Sleeping %0.02f', r)
        time.sleep(r)
        c.increment()
    logging.debug('Done')

if __name__ == '__main__':
    counter = Counter()
    for i in range(2):
        t = threading.Thread(target=worker, args=(counter,))
        t.start()

    logging.debug('Waiting for worker threads')
    main_thread = threading.currentThread()
    for t in threading.enumerate():
        if t is not main_thread:
            t.join()
    logging.debug('Counter: %d', counter.value)

đầu ra

(Thread-1 ) Sleeping 0.04
(MainThread) Waiting for worker threads
(Thread-2 ) Sleeping 0.11
(Thread-1 ) Waiting for a lock
(Thread-1 ) Acquired a lock
(Thread-1 ) Released a lock
(Thread-1 ) Sleeping 0.30
(Thread-2 ) Waiting for a lock
(Thread-2 ) Acquired a lock
(Thread-2 ) Released a lock
(Thread-2 ) Sleeping 0.27
(Thread-1 ) Waiting for a lock
(Thread-1 ) Acquired a lock
(Thread-1 ) Released a lock
(Thread-1 ) Done
(Thread-2 ) Waiting for a lock
(Thread-2 ) Acquired a lock
(Thread-2 ) Released a lock
(Thread-2 ) Done
(MainThread) Counter: 4

Trong ví dụ này, worker() cố gắng lấy khóa ba lần riêng biệt và đếm xem nó phải thực hiện bao nhiêu lần để làm như vậy. Đồng thời, tủ khóa () xoay vòng giữa giữ và nhả khóa, với thời gian ngủ ngắn ở mỗi trạng thái được sử dụng để mô phỏng tải

Cụ thể hơn, có an toàn khi thực hiện đồng thời nhiều thao tác trên một WebDriver/WebElement không? . e. một cái gì đó như thế này

WebDriver driver; //driver initialized somehow
final WebElement elem = driver.findElement(By.cssSelector("#elementID"));

//simplified for example, but in real code I'd be storing the results of these calls
new Thread() {
    @Override
    public void run() {
        elem.isDisplayed();
    }
}.run();
new Thread() {
    @Override
    public void run() {
        elem.isEnabled();
    }
}.run();

Tôi đã tự thử điều này mà không gặp vấn đề gì khi tương tác cục bộ, nhưng gặp sự cố không liên tục khi thực hiện điều tương tự với lưới selen từ xa

Tôi không chắc liệu các sự cố mà tôi gặp phải có phải đến từ chính Selenium hay Selenium vẫn ổn và đó là hạn chế của nhà cung cấp lưới được lưu trữ mà tôi đang sử dụng. Chủ đề selen có an toàn để cạo bằng Python không?

Giải pháp tốt nhất

Câu hỏi này được trả lời

"WebDriver không an toàn cho luồng. Phải nói rằng, nếu bạn có thể tuần tự hóa quyền truy cập vào phiên bản trình điều khiển cơ bản, bạn có thể chia sẻ tham chiếu trong nhiều luồng. Điều này là không nên. Mặt khác, bạn có thể/có thể khởi tạo một phiên bản WebDriver cho mỗi luồng. "

Giải pháp liên quan

Sự khác biệt giữa một quá trình và một chủ đề

Cả quy trình và luồng đều là các chuỗi thực thi độc lập. Sự khác biệt điển hình là các luồng (của cùng một quy trình) chạy trong một không gian bộ nhớ dùng chung, trong khi các quy trình chạy trong các không gian bộ nhớ riêng biệt

Tôi không chắc bạn có thể đang đề cập đến chủ đề "phần cứng" và "phần mềm" nào. Các luồng là một tính năng của môi trường hoạt động, chứ không phải là một tính năng của CPU (mặc dù CPU thường có các hoạt động giúp cho các luồng hoạt động hiệu quả)

Erlang sử dụng thuật ngữ "quy trình" vì nó không hiển thị mô hình đa chương trình bộ nhớ dùng chung. Gọi chúng là "chủ đề" có nghĩa là chúng có bộ nhớ dùng chung

Java – “triển khai Runnable” so với “mở rộng Chủ đề” trong Java

Đúng. thực hiện Runnable là cách ưa thích để làm điều đó, IMO. Bạn không thực sự chuyên về hành vi của chủ đề. Bạn chỉ đang cho nó một cái gì đó để chạy. Điều đó có nghĩa là sáng tác là cách "thuần khiết" hơn về mặt triết học

Về mặt thực tế, điều đó có nghĩa là bạn cũng có thể triển khai Runnable và mở rộng từ một lớp khác. và bạn cũng có thể triển khai Runnable thông qua biểu thức lambda kể từ Java 8

Có thể đa luồng trong Selenium không?

Selenium có thể sử dụng đa luồng trong một trình duyệt với sự trợ giúp của khung TestNG . TestNG cung cấp tính năng thực thi song song hoạt động trên khái niệm đa luồng Java. Để thực hiện các thử nghiệm dựa trên các tham số khác nhau, TestNG có một tệp XML nơi chúng tôi có các cấu hình.

Chủ đề Chromedriver có an toàn không?

Theo mặc định, WebDriver không phải là Chủ đề an toàn . Chúng ta có thể sử dụng lớp ThreadLocal trong Java để làm cho phiên bản WebDriver an toàn theo luồng. trình điều khiển ThreadLocal được bảo vệ = ThreadLocal mới(); .

Làm cách nào để chạy selen trong Python song song?

Để chạy thử nghiệm Selenium song song với Python, bạn cần cài đặt plugin pytest-xdist. .
Cân bằng tải đa quy trình – Có thể sử dụng nhiều CPU hoặc máy chủ để chạy thử nghiệm kết hợp. .
LooponFail – Các bài kiểm tra có thể được thực hiện lặp đi lặp lại trong một quy trình con