简体   繁体   English

“此套接字已被另一个 greenlet 使用”使用 locust 将响应时间报告到石墨中

[英]"This socket is already used by another greenlet" using locust to report response times into graphite

Hello I managed to get locust to work with graphite with the following code:您好,我设法让 locust 使用以下代码与石墨一起工作:

class MyLocust(HttpUser):
    tasks = [MyTask]
    sock = None

    def exit_handler(self):
        self.sock.shutdown(socket.SHUT_RDWR)
        self.sock.close()
 
    def hook_request_success(self, request_type, name, response_time, response_length):
        # print(response_time)
        message="%s %d %d\n" % ("client." + name.replace('.', '-'), response_time,  time.time())
        self.sock.send(message.encode())

    def hook_request_fail(self, request_type, name, response_time, exception):
        self.request_fail_stats.append([name, request_type, response_time, exception])

    def __init__(self, parent):
        super().__init__(parent)
        self.sock = socket.socket()
        self.sock.connect( ("192.168.XX.YYYY", 2003) )

        events.request_success.add_listener(self.hook_request_success)
        events.request_failure.add_listener(self.hook_request_fail)

        atexit.register(self.exit_handler)

Adn this works quiet good while I use a small amout of users in locust, around 100.当我在 locust 中使用一小部分用户(大约 100 个)时,这非常有效。

But when the users start to go up, I get the following exception:但是当用户开始 go 起来时,我得到以下异常:


[2021-05-31 18:40:48,430] HMG28/ERROR/root: Uncaught exception in event handler:
Traceback (most recent call last):
  File "c:\python39\lib\site-packages\gevent\_socketcommon.py", line 722, in send
    return self._sock.send(data, flags)
BlockingIOError: [WinError 10035] A non-blocking socket operation could not be completed immediately

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\python39\lib\site-packages\locust\event.py", line 40, in fire
    handler(**kwargs)
  File "C:\Users\AAA\Desktop\AAA\locust_files\locustfile.py", line 60, in hook_request_success
    self.sock.send(message.encode())
  File "c:\python39\lib\site-packages\gevent\_socketcommon.py", line 727, in send
    self._wait(self._write_event)
  File "src\\gevent\\_hub_primitives.py", line 317, in gevent._gevent_c_hub_primitives.wait_on_socket
  File "src\\gevent\\_hub_primitives.py", line 322, in gevent._gevent_c_hub_primitives.wait_on_socket
  File "src\\gevent\\_hub_primitives.py", line 297, in gevent._gevent_c_hub_primitives._primitive_wait
gevent.exceptions.ConcurrentObjectUseError: This socket is already used by another greenlet: <bound method Waiter.switch of <gevent._gevent_c_waiter.Waiter object at 0x00000222BA8FB4F0>>

Is there a way to make the socket connections wait until they can send the data?有没有办法让套接字连接等到它们可以发送数据?

Searching SO for your error, I found this possibly helpful answer:搜索您的错误,我发现这个可能有用的答案:

Non-Blocking error when adding timeout to python server 向 python 服务器添加超时时出现非阻塞错误

If you continue to have issues, you can try using a gevent compatible socket and see if that gets you the concurrency you want more easily.如果您仍然遇到问题,您可以尝试使用与gevent 兼容的套接字,看看是否可以更轻松地获得您想要的并发性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM