Closed zaoqi closed 5 years ago
run 就像正常的 web app 一样,必须是阻塞的,你是什么使用场景需要不阻塞呢
转发器。如果有两个bot库都要求阻塞就没法写了。现在一个库不阻塞,这个库阻塞。
我准备实现大于2个平台间的转发
...
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
如果是这样的话,最好是跑两个进程
如果一定要在一个进程里跑多个的话,aiocqhttp 可以用 Hypercorn API 运行:
import asyncio
from hypercorn.asyncio import serve
asyncio.run(serve(bot.asgi, config))
这里 serve()
就是一个协程了
config
是什么
from hypercorn.config import Config
config = Config()
config.bind = ["0.0.0.0:8000"]
这样应该可以
@zaoqi 就不要用 thread 了吧
用什么
loop.run_until_complete(asyncio.gather(serve(bot1.asgi, config1), serve(bot2.asgi, config2)))
这需要你两个平台的 bot 都必须是 asyncio 的
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))
不能工作。
用wxpy
@wxbot.register(wxgroup, wxpy.TEXT) def wxbot_receive_raw(rawmsg):
...
从这里调用
你这个代码换行都没了
原来是一个typo。现在能用了
怎么让它不阻塞?