nonebot / aiocqhttp

A Python SDK with async I/O for CQHTTP (OneBot).
https://aiocqhttp.nonebot.dev
MIT License
280 stars 39 forks source link

run好像会阻塞 #15

Closed zaoqi closed 5 years ago

zaoqi commented 5 years ago

怎么让它不阻塞?

stdrc commented 5 years ago

run 就像正常的 web app 一样,必须是阻塞的,你是什么使用场景需要不阻塞呢

zaoqi commented 5 years ago

转发器。如果有两个bot库都要求阻塞就没法写了。现在一个库不阻塞,这个库阻塞。

zaoqi commented 5 years ago

我准备实现大于2个平台间的转发

zaoqi commented 5 years ago
...
def run():                                                      asyncio.set_event_loop(asyncio.new_event_loop())
        qqbot.run(host=host, port=port)
    t=threading.Thread(target=run, args=())
    t.start()
...
[2019-02-02 09:00:07,313] ASGI Framework Lifespan error, continuing without Lifespan support                            >>> Exception in thread Thread-1:                           Traceback (most recent call last):                            File "/home/forwardbot/forwardbot/var/lib/python3.7/asyncio/unix_events.py", line 92, in add_signal_handler               signal.set_wakeup_fd(self._csock.fileno())              ValueError: set_wakeup_fd only works in main thread                                                                     During handling of the above exception, another exception occurred:                                                                                                                 Traceback (most recent call last):                            File "/home/forwardbot/forwardbot/var/lib/python3.7/threading.py", line 917, in _bootstrap_inner                          self.run()                                                File "/home/forwardbot/forwardbot/var/lib/python3.7/threading.py", line 865, in run                                       self._target(*self._args, **self._kwargs)                 File "bot.py", line 68, in run                                qqbot.run(host=host, port=port)                           File "/home/forwardbot/forwardbot/var/lib/python3.7/site-packages/aiocqhttp/__init__.py", line 228, in run                self._server_app.run(host=host, port=port, *args, **kwargs)                                                           File "/home/forwardbot/forwardbot/var/lib/python3.7/site-packages/quart/app.py", line 1346, in run                        run_single(self, config, loop=loop)  # type: ignore       File "/home/forwardbot/forwardbot/var/lib/python3.7/site-packages/hypercorn/asyncio/run.py", line 126, in run_single      loop.run_until_complete(worker_serve(app, config))        File "/home/forwardbot/forwardbot/var/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete              return future.result()                                    File "/home/forwardbot/forwardbot/var/lib/python3.7/site-packages/hypercorn/asyncio/run.py", line 157, in worker_serve    loop.add_signal_handler(signal.SIGINT, _signal_handler)   File "/home/forwardbot/forwardbot/var/lib/python3.7/asyncio/unix_events.py", line 94, in add_signal_handler               raise RuntimeError(str(exc))                            RuntimeError: set_wakeup_fd only works in main thread
stdrc commented 5 years ago

如果是这样的话,最好是跑两个进程

如果一定要在一个进程里跑多个的话,aiocqhttp 可以用 Hypercorn API 运行:

import asyncio
from hypercorn.asyncio import serve

asyncio.run(serve(bot.asgi, config))

这里 serve() 就是一个协程了

zaoqi commented 5 years ago

config是什么

stdrc commented 5 years ago
from hypercorn.config import Config
config = Config()
config.bind = ["0.0.0.0:8000"]

这样应该可以

stdrc commented 5 years ago

@zaoqi 就不要用 thread 了吧

zaoqi commented 5 years ago

用什么

stdrc commented 5 years ago
loop.run_until_complete(asyncio.gather(serve(bot1.asgi, config1), serve(bot2.asgi, config2)))

这需要你两个平台的 bot 都必须是 asyncio 的

zaoqi commented 5 years ago
def run():
        from hypercorn.asyncio import serve
        from hypercorn.config import Config
        config = Config()
        config.bind = [host+":"+str(port)]
        asyncio.run(serve(qqbot.asgi, config))
    run() # 阻塞!

这样的话

def qqbot_sendmsg(message):
        asyncio.run(qqbot.send_group_msg(group_id=group_id,\ message=mssage))

不能工作。

zaoqi commented 5 years ago

用wxpy

@wxbot.register(wxgroup, wxpy.TEXT)                         def wxbot_receive_raw(rawmsg):
...

从这里调用

stdrc commented 5 years ago

你这个代码换行都没了

zaoqi commented 5 years ago

原来是一个typo。现在能用了