Skip to content

Instantly share code, notes, and snippets.

@froop
Last active July 1, 2022 23:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save froop/8dd30dc630548653c8b324c6d313c522 to your computer and use it in GitHub Desktop.
Save froop/8dd30dc630548653c8b324c6d313c522 to your computer and use it in GitHub Desktop.
[Python] HTTP POST負荷テスト(ノンブロッキングI/O)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import time
import datetime
import threading
import sys
from selectors import DefaultSelector, EVENT_WRITE, EVENT_READ
message = '%s ERROR %s:' % (datetime.datetime.now().time(), '-' * 100)
content = '{"DATA":[{"TYPE":"STRING","KEY":"key01","MSG":"%s"}]}' % (message * 1000)
header = 'POST / HTTP/1.1\r\nContent-Length: %d' % len(content)
request = '%s\r\n\r\n%s' % (header, content)
payload = request.encode('ascii')
print(payload[:256])
class Crawler:
def __init__(self):
self.sock = None
self.response = b''
self.sock = socket.socket()
self.sock.setblocking(False)
try:
self.sock.connect(('manager', 8082))
except BlockingIOError:
pass
selector.register(self.sock.fileno(), EVENT_WRITE, self.connected)
def connected(self, key, mask):
selector.unregister(key.fd)
try:
self.sock.sendall(payload)
selector.register(key.fd, EVENT_READ, self.read_response)
except (BlockingIOError, TimeoutError) as ex:
print(ex, file=sys.stderr)
def read_response(self, key, mask):
try:
self.response = self.sock.recv(1024)
print(self.response)
except (ConnectionResetError, TimeoutError, ConnectionRefusedError) as ex:
print(ex, file=sys.stderr)
selector.unregister(key.fd)
def loop():
while True:
events = selector.select()
for event_key, event_mask in events:
callback = event_key.data
callback(event_key, event_mask)
selector = DefaultSelector()
threading.Thread(target=loop).start()
for i in range(1000):
print(i)
Crawler()
time.sleep(0.1)
# 参考: Pythonの非同期プログラミングを完全理解 - Qiita
# https://qiita.com/kaitolucifer/items/3476158ba5bd8751e022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment