10.python3.6-3.12 安装/使用funboost出错问题反馈

目前已经测试了python3.6 3.7 3.8 3.9 3.10 3.11 版本的安装,

其中3.6 3.7 用的比较多,linux和win都运行了。3.9 3.10 3.11 版本在win下测试了安装和一部分demo例子运行功能。

如果有安装不了的问题,请截完整图片说明,加python版本+操作系统类型(主要分win和linux/mac)

如果有安装后使用某个属于框架本身的功能出错的,请截完整图片说明

10.0 框架与你项目依赖的三方包版本不一致冲突?

用户完全可以自由选择任何三方包版本。例如你的 sqlalchemy pymongo等等与框架需要的版本不一致,你完全可以自由选择任何版本。
我开发时候实现了很多种中间件,没有时间长期对每一种中间件三方包的每个发布版本都做兼容测试,所以我固定死了。

用户完全可以选择自己的三方包版本,大胆点,等报错了再说,不出错怎么进步,不要怕代码报错,请大胆点升级你想用的版本。
如果是你是用你自己项目里面的requirements.txt方式自动安装三方包,我建议你在文件中第一行写上 funboost,之后再写其它包
这样就能使用你喜欢的版本覆盖funboost框架依赖的版本了。等用的时候报错了再说。一般不会不兼容报错的请大胆点。

例如在生产环境用户一般固定死版本在requirements.txt,比如写 django==3.0.7,难道安装了django 3.0.8,代码就会报错,服务器就会爆炸吗,
提示版本冲突有啥好害怕的,一般情况下,只要不是大版本升级,或者你使用了三方包很小众的私有方法,才会有可能出现由于版本不同,导致代码报错.

10.1 windwos安装后如果报错 ImportError: DLL load failed while importing win32file

linux和mac是不会有这个问题的,win如果出现的话,按下面操作。

import win32file
ImportError: DLL load failed while importing win32file: 找不到指定的模块。

img_21.png

切换到python安装目录的scripts文件夹下,使用指定的python解释器运行。例如你安装了好几个python环境,用指定的python环境的解释器运行。

python3.9 pywin32_postinstall.py -install (这里python3.9 代指的是具体的对应的python安装文件夹下的那个python.exe)

参考博客: ImportError: DLL load failed while importing win32api: 找不到指定的模块

10.2 启动消费后报错: RuntimeError: cannot schedule new futures after interpreter shutdown

定时apscheduler任务(或一些其他包的使用) 在一些python版本,导致报错 RuntimeError: cannot schedule new futures after interpreter shutdown

只要在你的启动脚本的最最末尾加上死循环阻止主线程退出就好了.

你的代码最最后一行代码加上:

import time
while 1:
  time.sleep(100)

或者在代码最后一行加上 run_forever()

from funboost import run_forever # 先导入run_forever

run_forever()  # 这个函数就是 while 1 :time.sleep(100)    就是阻止主线程结束.
Error submitting job "timing_publish_deco.<locals>._deco (trigger: interval[0:00:03], next run at: 2023-01-29 15:49:11 CST)" to executor "default"
Traceback (most recent call last):
  File "D:\ProgramData\Miniconda3\envs\py311\Lib\site-packages\apscheduler\schedulers\base.py", line 979, in _process_jobs
    executor.submit_job(job, run_times)
  File "D:\ProgramData\Miniconda3\envs\py311\Lib\site-packages\apscheduler\executors\base.py", line 71, in submit_job
    self._do_submit_job(job, run_times)
  File "D:\ProgramData\Miniconda3\envs\py311\Lib\site-packages\apscheduler\executors\pool.py", line 28, in _do_submit_job
    f = self._pool.submit(run_job, job, job._jobstore_alias, run_times, self._logger.name)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\ProgramData\Miniconda3\envs\py311\Lib\concurrent\futures\thread.py", line 169, in submit
    raise RuntimeError('cannot schedule new futures after '
RuntimeError: cannot schedule new futures after interpreter shutdown
如上报错,在python3.9以上会报错这个,因为是使用的 apscheduler的 BackgroundScheduler类,在python3.9以上,
如果代码的主线程结束了,不管子线程是否还在运行,都会报错 RuntimeError: cannot schedule new futures after interpreter shutdown,
此时只需要使主线程不结束就行了,那就是在你的启动脚本的最最末尾的地方加上以下两句就可以了。

while 1:
  time.sleep(100)

加了 while 1:
     time.sleep(100)
后,主线程代码就会无限死循环,这样主线程永远不会结束了。

原因是:

funboost 内置的apscheduler 对象,是实例化 BackGroundScheduler ,而不是实例化 BlockingScheduler ,

如下代码:

aps_scheduler_obj.start()
print('hello')

如果 aps_scheduler_obj 类型是 BackGroundScheduler,控制台可以打印出hello,
但在python3.9以上要确保主线程不能退出,否则定时器就会报错结束了,所以最末尾加 while 1: time.sleep(100)阻止主线程退出。
funboost为了启动定时器 scheduler.start() 和启动消费 taskfun.consume() 随意哪一行写在前面都能运行所有代码,所以内置的实例化的对象是 BackGroundScheduler 类型


如果 aps_scheduler_obj 类型是 BlockingScheduler,控制台不能打印出hello,必须确保 aps_scheduler_obj.start() 是写在代码的最后一行,
这种当然不需要代码最末尾加个 while 1: time.sleep(100)阻止主线程退出了。

10.3 文档1.3例子 BrokerEnum.PERSISTQUEUE,sqlite作为中间件例子在mac/linux运行,报错 read-only

文档1.3例子 BrokerEnum.PERSISTQUEUE,sqlite作为中间件例子在mac/linux运行,报错 read-only file system : '/sqllite_queues'

img_48.png

因为你选择是使用sqlite作为消息队列中间件,那么就需要在用户电脑上创建文件夹和文件,来存放sqlite数据库数据, 有很多人不是windows电脑运行,linux和mac权限严格,非root用户是无法在硬盘根目录自动创建/sqllite_queues 文件夹并写入数据的,报错已经很明显了,有些人还是一报错就慌了, 需要你在项目根目录下的 funboost_config.py 中 指定 SQLLITE_QUEUES_PATH 为一个有操作权限的文件夹就可以了.