worker_api.md 4.0 KB

提交任务

ui 目录是用户页面,有前后端代码。

非 ui 目录是另一个独立的项目,我把它称为 celery 项目,跟 ui 目录的代码并不能相互调用。

在 celery 项目中也有一个后端服务, worker\api\worker_server.py ,它可以由 ui 项目 ui\backend\src\services\celery_worker.py 启动该进程。并且发起请求。

例如,在 ui 项目中,用户点击了按钮,请求 search 到 ui 后端 ui\backend\routers\worker.py 的 /ctrl 接口中,然后 ui 后端再发起请求到 celery 项目的 worker\api\worker_router.py 中的 /search 接口。 celery 会在自己的数据库中读取数据库任务,并且提交到 redis 中。

在 ui 后端请求 celery 后端过程中,我希望根据 select_proxy 是 system 还是 pool 来决定传输什么参数。如果是 system ,则不用传代理,因为 celery /search 中的 worker 会启动一个浏览器,浏览器默认就是系统代理。如果是 pool ,则需要传递代理池数据。 代理池数据可以根据 ui 后端的 config.backend.host:config.backend.port 的 /api/proxy/proxies-pool 接口获取。例如:

Curl

curl -X 'GET' \
  'http://localhost:5835/api/proxy/proxies-pool?force_refresh=false' \
  -H 'accept: application/json'
Request URL
http://localhost:5835/api/proxy/proxies-pool?force_refresh=false
Server response
Code	Details
200	
Response body
Download
{
  "proxies": [
    "127.0.0.1:9660",
    "127.0.0.1:9662",
    "127.0.0.1:9664",
    "127.0.0.1:9666",
    "127.0.0.1:9668"
  ],
  "cached": true
}

backend host

ui 目录是用户页面,有前后端代码。

非 ui 目录是另一个独立的项目,我把它称为 celery 项目,跟 ui 目录的代码并不能相互调用。

在 celery 项目中也有一个后端服务, worker\api\worker_server.py ,它可以由 ui 项目 ui\backend\src\services\celery_worker.py 启动该进程。

现在我不但想启动,还想自定义 celery 后端的主机和端口,由 ui 项目配置 Config.worker_backend 来决定。帮我修改完成代码。

worker api

上述代码似乎有很多问题,你来帮我判断:

  • 项目采用 SQLmodel 驱动 SQLite 数据库,DB_URL = os.environ.get('DB_URL') or f"sqlite:///{OUTPUT_DIR}/temp.db" ,在别的地方会用到,而且几乎都是同步操作的代码。只有对外开放API接口时, Fastapi 是使用异步接口。
  • 如何兼容同步与异步的代码?
  • read_keywords_from_file 从表格读取数据,如果涉及到 2k~3w 行的数据读取,是否是一个耗时操作?如果耗时能否移入线程操作
  • bulk_import_keywords_to_db 是导入到数据库,如果关键词存在则跳过, 代码中是否能让 SQLite 优雅的批量导入。并且这同样可能是一个耗时操作
  • 这是一个已知错误: 025-02-21 20:28:15 | ERROR | excel_load.py:51 :import_keywords - 文件处理失败: (sqlite3.IntegrityError) UNIQUE constraint failed: keywordtask.keyword [SQL: INSERT INTO keywordtask (keyword, total_results, is_completed, fail_count, created_at) VALUES (?, ?, ?, ?, ?) RETURNING id] parameters: ('absorb', None, 0, 0, '2025-02-21 20:28:04.936669') INFO: 127.0.0.1:5911 - "POST /keywords/upload HTTP/1.1" 500 Internal Server Error

worker\api\excel_load.py worker\api\main.py worker\api\search_cli.py

假设这3个文件是构成一个微服务,并且可以启动许多个微服务来批量执行任务。不过目前场景中只需要一个微服务 localhost:8003 。

然后我想在另一个独立的项目中发起微服务请求执行各种任务。 例如 G:\code\upwork\zhang_crawl_bio\ui\backend\main.py 文件是一个UI后端 localhost:5835 ,它跟前端交互。

现在用户在前端上传文件,我应该直接上传到 localhost:8003 还是经过 localhost:5835 进行路由? 如果不用 5835 路由,那么又该如何通知前端有两个 API 地址? 如果用 5835 路由,是否又符合最佳软件设计架构?