ThreadPoolExecutor yêu cầu Python

API của chúng tôi được thiết kế để cho phép bạn có nhiều thao tác cạo đồng thời. Điều đó có nghĩa là bạn có thể tăng tốc độ quét hàng trăm, hàng nghìn hoặc thậm chí hàng triệu trang mỗi ngày, tùy thuộc vào kế hoạch của bạn

Bạn càng có nhiều yêu cầu đồng thời giới hạn, bạn càng có nhiều cuộc gọi hoạt động song song và bạn có thể cạo càng nhanh

Tiện ích bổ sung nhỏ cho thư viện http yêu cầu python. Sử dụng python 3. 2 đồng thời. tương lai hoặc backport cho các phiên bản trước của python

API bổ sung và các thay đổi là tối thiểu và cố gắng tránh những bất ngờ

Mã đồng bộ sau

from requests import Session

session = Session[]
# first requests starts and blocks until finished
response_one = session.get['//httpbin.org/get']
# second request starts once first is finished
response_two = session.get['//httpbin.org/get?foo=bar']
# both requests are complete
print['response one status: {0}'.format[response_one.status_code]]
print[response_one.content]
print['response two status: {0}'.format[response_two.status_code]]
print[response_two.content]

Có thể được dịch để sử dụng tương lai và do đó không đồng bộ bằng cách tạo FuturesSession và bắt Tương lai được trả về thay cho Phản hồi. Phản hồi có thể được truy xuất bằng cách gọi phương thức kết quả trên Tương lai

from requests_futures.sessions import FuturesSession

session = FuturesSession[]
# first request is started in background
future_one = session.get['//httpbin.org/get']
# second requests is started immediately
future_two = session.get['//httpbin.org/get?foo=bar']
# wait for the first request to complete, if it hasn't already
response_one = future_one.result[]
print['response one status: {0}'.format[response_one.status_code]]
print[response_one.content]
# wait for the second request to complete, if it hasn't already
response_two = future_two.result[]
print['response two status: {0}'.format[response_two.status_code]]
print[response_two.content]

Theo mặc định, ThreadPoolExecutor được tạo với 8 công nhân. Nếu bạn muốn điều chỉnh giá trị đó hoặc chia sẻ trình thực thi trong nhiều phiên, bạn có thể cung cấp một trình tạo cho hàm tạo FuturesSession

from concurrent.futures import ThreadPoolExecutor
from requests_futures.sessions import FuturesSession

session = FuturesSession[executor=ThreadPoolExecutor[max_workers=10]]
# ...

Là một lối tắt trong trường hợp chỉ tăng số công nhân, bạn có thể chuyển thẳng max_workers tới hàm tạo FuturesSession

from requests_futures.sessions import FuturesSession
session = FuturesSession[max_workers=10]

FutureSession sẽ sử dụng một đối tượng phiên hiện có nếu được cung cấp

from requests import session
from requests_futures.sessions import FuturesSession
my_session = session[]
future_session = FuturesSession[session=my_session]

Đó là nó. api của yêu cầu. Phiên được giữ nguyên mà không có bất kỳ sửa đổi nào ngoài việc trả về Tương lai thay vì Phản hồi. Như với tất cả các ngoại lệ tương lai được chuyển [ném] sang tương lai. result[] gọi vì vậy hãy thử/ngoại trừ các khối nên được chuyển đến đó

Hủy các yêu cầu đã xếp hàng đợi [a. k. dọn dẹp sau khi chính mình]

Nếu bạn biết rằng bạn sẽ không cần thêm bất kỳ phản hồi nào từ các hợp đồng tương lai chưa được giải quyết, bạn nên hủy các yêu cầu đó. Bạn có thể làm điều này bằng cách sử dụng phiên làm trình quản lý bối cảnh

from requests_futures.sessions import FuturesSession
with FuturesSession[max_workers=1] as session:
    future = session.get['//httpbin.org/get']
    future2 = session.get['//httpbin.org/delay/10']
    future3 = session.get['//httpbin.org/delay/10']
    response = future.result[]

Trong ví dụ này, yêu cầu thứ hai hoặc thứ ba sẽ bị bỏ qua, tiết kiệm thời gian và tài nguyên nếu không sẽ bị lãng phí

Làm việc trong nền

Quá trình xử lý bổ sung có thể được thực hiện trong nền bằng cách sử dụng chức năng hook của yêu cầu. Điều này có thể hữu ích cho việc chuyển công việc ra khỏi nền trước, ví dụ đơn giản là phân tích cú pháp json

from pprint import pprint
from requests_futures.sessions import FuturesSession

session = FuturesSession[]

def response_hook[resp, *args, **kwargs]:
    # parse the json storing the result on the response object
    resp.data = resp.json[]

future = session.get['//httpbin.org/get', hooks={
    'response': response_hook,
}]
# do some other stuff, send some more requests while this one works
response = future.result[]
print['response status {0}'.format[response.status_code]]
# data will have been attached to the response object in the background
pprint[response.data]

Móc cũng có thể được áp dụng cho phiên

from pprint import pprint
from requests_futures.sessions import FuturesSession

def response_hook[resp, *args, **kwargs]:
    # parse the json storing the result on the response object
    resp.data = resp.json[]

session = FuturesSession[]
session.hooks['response'] = response_hook

future = session.get['//httpbin.org/get']
# do some other stuff, send some more requests while this one works
response = future.result[]
print['response status {0}'.format[response.status_code]]
# data will have been attached to the response object in the background
pprint[response.data]   pprint[response.data]

Một ví dụ nâng cao hơn có thêm thuộc tính đã qua cho tất cả các yêu cầu

________số 8

Sử dụng ProcessPoolExecutor

Tương tự như ThreadPoolExecutor, có thể sử dụng một phiên bản của ProcessPoolExecutor. Đúng như tên gọi, các yêu cầu sẽ được thực hiện đồng thời trong các quy trình riêng biệt thay vì các luồng

from concurrent.futures import ProcessPoolExecutor
from requests_futures.sessions import FuturesSession

session = FuturesSession[executor=ProcessPoolExecutor[max_workers=10]]
# .. use as before

Yêu cầu cơ bản của việc sử dụng ProcessPoolExecutor là Phiên. yêu cầu, FutureSession đều có thể chọn được

Điều này có nghĩa là chỉ Python 3. 5 được hỗ trợ đầy đủ, trong khi Python phiên bản 3. 4 trở lên YÊU CẦU một yêu cầu hiện có. Phiên bản phiên sẽ được thông qua khi khởi tạo FutureSession. Trăn 2. X và

Chủ Đề