Celery嵌入工程的使用

文章目录
    • 1.config
      • 1.1 通过app.conf进行配置
      • 1.2 通过app.conf.update进行配置
      • 1.3 通过配置文件进行配置
      • 1.4 通过配置类的方式进行配置
    • 2.任务相关
      • 2.1 任务基类(base)
      • 2.2 任务名称(name)
      • 2.3 任务请求(request)
      • 2.4 任务重试(retry)
        • 2.4.1 指定最大重试次数
        • 2.4.2 设置重试间隔时间
        • 2.4.3 最大重试次数时报告的自定义异常
        • 2.4.4 重试指定异常
    • 3.序列化
    • 4.后台操作worker和启动多个worker
    • 5.和django集成

1.config

默认配置文件在源码中的celery.app.defaults中,可以看到各种的配置

目录结构

study- proj					# 包- __init__.py		# 必须含有__init__.py文件- celery.py			# 实例化Celery,配置broker和backend相关- tasks.py			# 任务- add_task1.py			# 添加任务- config.py				# 配置相关

proj/celery.py

from celery import Celerybroker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
app = Celery(__name__, broker=broker, backend=backend, include=['proj.tasks'])

proj/tasks.py

from .celery import app@app.task
def add(x, y):return x + y@app.task
def mul(x, y):return x * y

add_task1.py

from proj.tasks import add, mul# 执行异步任务
result = add.delay(1, 2)
result1 = mul.delay(8, 2)
print(result)
print(result1)

1.1 通过app.conf进行配置

# 在proj/celery.py下进行编辑app.conf.timezone = 'Asia/Shanghai'
app.conf.enable_utc = False

1.2 通过app.conf.update进行配置

# 在proj/celery.py下进行编辑app.conf.update(enable_utc=False,timezone='Asia/Shanghai',
)

1.3 通过配置文件进行配置

# 在config.py中添加以下内容
timezone = 'Asia/Shanghai'
enable_utc = False# 在proj/celery.py添加以下内容
app.config_from_object('config')# 可以在控制台输入python -m config查看配置是否正确

1.4 通过配置类的方式进行配置

# 在config.py中添加以下内容
class Config:timezone = 'Asia/Shanghai'enable_utc = False# 在proj/celery.py添加以下内容
from config import Configapp.config_from_object(Config)

2.任务相关

目录结构

study- proj					# 包- __init__.py		# 必须含有__init__.py文件- celery.py			# 实例化Celery,配置broker和backend相关- tasks.py			# 任务- add_task1.py			# 添加任务- config.py				# 配置相关

proj/celery.py

from celery import Celerybroker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
app = Celery(__name__, broker=broker, backend=backend, include=['proj.tasks'])

proj/tasks.py

from .celery import app@app.task
def add(x, y):return x + y@app.task
def mul(x, y):return x * y

add_task1.py

from proj.tasks import add, mul# 执行异步任务
result = add.delay(1, 2)
result1 = mul.delay(8, 2)
print(result)
print(result1)

2.1 任务基类(base)

proj/tasks.py

# 写一个类通过继承celery.Task完成任务基类
# 重写指定方法实现执行成功、失败、重试打印对应信息
import celery
from .celery import appclass CeleryTask(celery.Task):def on_failure(self, exc, task_id, args, kwargs, einfo):""":param exc:任务引发的异常:param task_id:失败任务的唯一id:param args:失败任务的原始参数:param kwargs:失败任务的原始关键字参数:param einfo:异常信息"""print(f'{task_id} 失败,异常为: {exc}')def on_retry(self, exc, task_id, args, kwargs, einfo):""":param exc:任务引发的异常:param task_id:失败任务的唯一id:param args:失败任务的原始参数:param kwargs:失败任务的原始关键字参数:param einfo:异常信息"""print(f'{task_id} 重试异常为: {exc}')def on_success(self, retval, task_id, args, kwargs):""":param retval: 任务的返回值。:param task_id: 已执行任务的唯一id。:param args: 已执行任务的原始参数。:param kwargs: 已执行任务的原始关键字参数。:return: """print(f'{task_id} 成功,结果为: {retval}')# 通过装饰器传参将写的类传入
@app.task(base=CeleryTask)
def add(x, y):return x + y# 通过装饰器传参将写的类传入
@app.task(base=CeleryTask)
def mul(x, y):return x * y

启动worker

# linux启动
celery -A proj worker -l info
# windows启动
celery -A proj worker -l info -P eventlet# 启动worker后添加任务,运行python add_task1.py(需要cd到add_task1所在的目录下)---console----------------- celery@DESKTOP-IPV07D4 v5.2.3 (dawn-chorus)
--- ***** -----
-- ******* ---- Windows-10-10.0.19041-SP0 2022-04-07 14:22:19
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app:         proj.celery:0x1de2ae29688
- ** ---------- .> transport:   redis://127.0.0.1:6379/1
- ** ---------- .> results:     redis://127.0.0.1:6379/2
- *** --- * --- .> concurrency: 8 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ------------------- [queues].> celery           exchange=celery(direct) key=celery[tasks]. proj.tasks.add. proj.tasks.mul[2022-04-07 14:22:19,329: INFO/MainProcess] Connected to redis://127.0.0.1:6379/1
[2022-04-07 14:22:19,331: INFO/MainProcess] mingle: searching for neighbors
[2022-04-07 14:22:20,340: INFO/MainProcess] mingle: all alone
[2022-04-07 14:22:20,345: INFO/MainProcess] pidbox: Connected to redis://127.0.0.1:6379/1.
[2022-04-07 14:22:20,349: INFO/MainProcess] celery@DESKTOP-IPV07D4 ready.
[2022-04-07 14:22:37,055: INFO/MainProcess] Task proj.tasks.add[ee9576c2-4db6-4781-b98f-54bd50f2fb71] received
[2022-04-07 14:22:37,058: INFO/MainProcess] Task proj.tasks.mul[9a0dd6be-13fb-4093-a332-ee6675a24ebf] received
[2022-04-07 14:22:37,061: WARNING/MainProcess] ee9576c2-4db6-4781-b98f-54bd50f2fb71 成功,结果为: 3
[2022-04-07 14:22:37,061: INFO/MainProcess] Task proj.tasks.add[ee9576c2-4db6-4781-b98f-54bd50f2fb71] succeeded in 0.0s: 3
[2022-04-07 14:22:37,062: WARNING/MainProcess] 9a0dd6be-13fb-4093-a332-ee6675a24ebf 成功,结果为: 16
[2022-04-07 14:22:37,062: INFO/MainProcess] Task proj.tasks.mul[9a0dd6be-13fb-4093-a332-ee6675a24ebf] succeeded in 0.0s: 16

2.2 任务名称(name)

目录结构

study- proj					# 包- __init__.py		# 必须含有__init__.py文件- celery.py			# 实例化Celery,配置broker和backend相关- tasks.py			# 任务- add_task1.py			# 添加任务- config.py				# 配置相关

proj/celery.py

from celery import Celerybroker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
app = Celery(__name__, broker=broker, backend=backend, include=['proj.tasks'])

proj/tasks.py

from .celery import app@app.task
def add(x, y):return x + y@app.task
def mul(x, y):return x * y

add_task1.py

from proj.tasks import add, mul# 执行异步任务
result = add.delay(1, 2)
result1 = mul.delay(8, 2)
print(result)
print(result1)

每一个任务都必须有一个唯一任务名称。如果没有指定任务名称,装饰器会根据当前任务所在的模块以及任务函数的名称进行生成一个,例如现在启动workercelery -A proj worker -l info -P eventlet后,控制台中可以看到任务名称,如下图
在这里插入图片描述
如果任务过多,可以通过自己命名方式进行命名
tasks.py

from .celery import app@app.task(name='add')
def add(x, y):return x + y@app.task(name='mul')
def mul(x, y):return x * y

此时启动worker,可以看到名称已修改成对应的名称,运行任务处的名称同样已修改。
在这里插入图片描述

2.3 任务请求(request)

目录结构

study- proj					# 包- __init__.py		# 必须含有__init__.py文件- celery.py			# 实例化Celery,配置broker和backend相关- tasks.py			# 任务- add_task1.py			# 添加任务- config.py				# 配置相关

proj/celery.py

from celery import Celerybroker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
app = Celery(__name__, broker=broker, backend=backend, include=['proj.tasks'])

proj/tasks.py

from .celery import app@app.task
def add(x, y):return x + y@app.task
def mul(x, y):return x * y

request包含与当前执行任务相关的信息和状态

tasks.py

# bind 参数表示该函数绑是一个绑定方法,可以通过访问任务类型实例中的属性和方法
@app.task(bind=True)
def add(self, x, y):print(self.request)return x + y
# 启动worker后,将任务添加,可以看到worker处打印下方信息---console---
<Context: {'lang': 'py', 'task': 'proj.tasks.add', 'id': '7b347ce7-18c8-4afb-be37-8063503780a0', 'shadow': None, 'eta': None, 'expires': None, 'group': None, 'group_index': None, 'retries': 0, 'timelimit': [None, None]
, 'root_id': '7b347ce7-18c8-4afb-be37-8063503780a0', 'parent_id': None, 'argsrepr': '(1, 2)', 'kwargsrepr': '{}', 'origin': 'gen15340@DESKTOP-IPV07D4', 'ignore_result': False, 'properties': {'correlation_id': '7b347ce7-18c8-4afb-be37-8063503780a0', 'reply_to': '76f
85df8-e5b9-37cc-8d03-66b19e61ebee', 'delivery_mode': 2, 'delivery_info': {'exchange': '', 'routing_key': 'celery'}, 'priority': 0, 'body_encoding': 'base64', 'delivery_tag': 'df94e00a-033a-4f29-8ab0-c4fd3f33326c'}, 'reply_to': '76f85df8-e5b9-37cc-8d03-66b19e61ebee'
, 'correlation_id': '7b347ce7-18c8-4afb-be37-8063503780a0', 'hostname': 'celery@DESKTOP-IPV07D4', 'delivery_info': {'exchange': '', 'routing_key': 'celery', 'priority': 0, 'redelivered': None}, 'args': [1, 2], 'kwargs': {}, 'is_eager': False, 'callbacks': None, 'er
rbacks': None, 'chain': None, 'chord': None, 'called_directly': False, '_protected': 1}>

2.4 任务重试(retry)

当任务执行出错后,自动重试任务,可指定发生指定异常重试,设置重试次数,设置重试间隔时间等

目录结构

study- proj					# 包- __init__.py		# 必须含有__init__.py文件- celery.py			# 实例化Celery,配置broker和backend相关- tasks.py			# 任务- add_task1.py			# 添加任务- config.py				# 配置相关

proj/celery.py

from celery import Celerybroker = 'redis://127.0.0.1:6379/1'
backend = 'redis://127.0.0.1:6379/2'
app = Celery(__name__, broker=broker, backend=backend, include=['proj.tasks'])

proj/tasks.py

from .celery import app@app.task
def add(x, y):return x + y@app.task
def mul(x, y):return x * y

add_task1.py

from proj.tasks import add, mul# 执行异步任务
result = add.delay(1, 2)
print(result)

在tasks.py中修改代码

加粗样式

@app.task(bind=True)
def add(self, x, y):try:z = x + yreturn zexcept Exception as e:raise self.retry()

修改add_task1.py让执行任务时发生异常

result = add.delay(['1'], 2)
print(result)
  • 启动worker
  • 添加任务

此时观察控制台

---console----------------- celery@DESKTOP-IPV07D4 v5.2.3 (dawn-chorus)
--- ***** -----
-- ******* ---- Windows-10-10.0.19041-SP0 2022-04-07 16:14:45
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app:         proj.celery:0x13f283ea5c8
- ** ---------- .> transport:   redis://127.0.0.1:6379/1
- ** ---------- .> results:     redis://127.0.0.1:6379/2
- *** --- * --- .> concurrency: 8 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ------------------- [queues].> celery           exchange=celery(direct) key=celery[tasks]. proj.tasks.add. proj.tasks.mul[2022-04-07 16:14:45,885: INFO/MainProcess] Connected to redis://127.0.0.1:6379/1
[2022-04-07 16:14:45,887: INFO/MainProcess] mingle: searching for neighbors
[2022-04-07 16:14:46,900: INFO/MainProcess] mingle: all alone
[2022-04-07 16:14:46,907: INFO/MainProcess] pidbox: Connected to redis://127.0.0.1:6379/1.
[2022-04-07 16:14:46,909: INFO/MainProcess] celery@DESKTOP-IPV07D4 ready.
[2022-04-07 16:17:31,285: INFO/MainProcess] Task proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] received
[2022-04-07 16:17:31,290: INFO/MainProcess] Task proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] received
[2022-04-07 16:17:31,292: INFO/MainProcess] Task proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] retry: Retry in 3s
[2022-04-07 16:20:31,302: INFO/MainProcess] Task proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] received
[2022-04-07 16:20:31,305: INFO/MainProcess] Task proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] retry: Retry in 3s
[2022-04-07 16:23:31,314: INFO/MainProcess] Task proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] received
[2022-04-07 16:23:31,317: INFO/MainProcess] Task proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] retry: Retry in 3s
[2022-04-07 16:26:31,312: ERROR/MainProcess] Task proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] raised unexpected: MaxRetriesExceededError("Can't retry proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] args:(['1'], 2) kwargs:{}")
Traceback (most recent call last):File "C:\Users\Dell\Desktop\study_celery\test\proj\tasks.py", line 49, in addz = x + y
TypeError: can only concatenate list (not "int") to listDuring handling of the above exception, another exception occurred:Traceback (most recent call last):File "D:\Virtualenvs\celery\lib\site-packages\celery\app\trace.py", line 451, in trace_taskR = retval = fun(*args, **kwargs)File "D:\Virtualenvs\celery\lib\site-packages\celery\app\trace.py", line 734, in __protected_call__return self.run(*args, **kwargs)File "C:\Users\Dell\Desktop\study_celery\test\proj\tasks.py", line 53, in addraise self.retry()File "D:\Virtualenvs\celery\lib\site-packages\celery\app\task.py", line 721, in retry), task_args=S.args, task_kwargs=S.kwargs
celery.exceptions.MaxRetriesExceededError: Can't retry proj.tasks.add[268b203a-1291-4e24-854f-686edf9a09f3] args:(['1'], 2) kwargs:{}

发现每次重试间隔180s,默认为180s,重试三次后触发MaxRetriesExceededError,默认重试三次
 

2.4.1 指定最大重试次数

@app.task(bind=True)
def add(self, x, y):try:z = x + yreturn zexcept Exception as e:raise self.retry(max_retries=4)

通过max_retries参数指定最大重试次数,重试指定次数后如果还有异常会触发MaxRetriesExceededError

2.4.2 设置重试间隔时间

@app.task(bind=True, default_retry_delay=3)
def add(self, x, y):try:z = x + yreturn zexcept Exception as e:raise self.retry(max_retries=4)# raise self.retry(max_retries=4,countdown=6)

通过此参数default_retry_delay设置重试间隔,单位为秒,默认为3分钟;也可以通过retry中的countdown参数进行设置,countdown参数会覆盖default_retry_delay,二者用其一即可

2.4.3 最大重试次数时报告的自定义异常

@app.task(bind=True, default_retry_delay=3)
def add(self, x, y):try:z = x + yreturn zexcept Exception as e:raise self.retry(exc=e, max_retries=4)

设置exc参数,执行指定重试次数,如果还发生异常,将发生的异常为指定的异常

---console---
[2022-04-07 16:35:48,697: ERROR/MainProcess] Task proj.tasks.add[6e872f2d-3aa4-4873-87f1-28a86abdac90] raised unexpected: TypeError('can only concatenate list (not "int") to list')
Traceback (most recent call last):File "D:\Virtualenvs\celery\lib\site-packages\celery\app\trace.py", line 451, in trace_taskR = retval = fun(*args, **kwargs)File "D:\Virtualenvs\celery\lib\site-packages\celery\app\trace.py", line 734, in __protected_call__return self.run(*args, **kwargs)File "C:\Users\Dell\Desktop\study_celery\test\proj\tasks.py", line 53, in addraise self.retry(exc=e, max_retries=4)File "D:\Virtualenvs\celery\lib\site-packages\celery\app\task.py", line 717, in retryraise_with_context(exc)File "C:\Users\Dell\Desktop\study_celery\test\proj\tasks.py", line 49, in addz = x + y
TypeError: can only concatenate list (not "int") to list

2.4.4 重试指定异常

# 当发生TypeError异常时,会重试5次,每次重试时间为60s,不发生TypeError异常终止
@app.task(autoretry_for=(TypeError,), retry_kwargs={'max_retries': 5, 'countdown': 60})
def add(x, y):return x + y

3.序列化

标识需要使用默认序列化的字符串。默认为 json,也可以为 pickle、json、yaml 或者通过 kombu.serialization.registry注册的自定义序列化方法。

config.py

app.conf.update(task_serializer='json',accept_content=['json'], result_serializer='json',
)

4.后台操作worker和启动多个worker

# 好像不支持windows后台运行worker,在linux尝试成功了
# 以下为linux中使用# start为启动,对应还有stop,restart 
# w1为别名,当别名为数字的时候会启动多个worker# 启动一个名称为w1的后台worker任务
celery multi start w1 -A proj -l info# 启动10个后台worker任务,默认名称为celery1····10
celery multi start 10 -A proj -l info

默认情况下会在当前目录中创建pid文件和日志文件,为防止多个worker干扰,建议将这些文件存放在专门的目录中,默认pid存放在/var/run/celery下,log存放在/var/log/celery/下,也可以自己进行指定

celery multi start w1 -A proj -l info --pidfile=./pid/%n.pid --logfile=./log/%n.log

5.和django集成

目录结构

# 在项目根路径下创建celery_task
celery_task__init__.pycelery.py				tasks.py

celery.py

import os
import django
from celery import Celery# 一定要加载django的环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'phoneapi.settings.dev')
django.setup()broker = 'redis://127.0.0.1:6379/1'  # 任务储存
backend = 'redis://127.0.0.1:6379/2'  # 结果存储,执行完之后结果放在这app = Celery(__name__, broker=broker, backend=backend, include=['celery_task.tasks'])# 指令
# celery beat -A celery_task -l info
# 任务的定时配置
from datetime import timedeltaapp.conf.beat_schedule = {'low-task': {'task': 'celery_task.tasks.get_all_user','schedule': timedelta(seconds=30),}
}

tasks.py

from .celery import app@app.task
def get_all_user():# 一定要在此处导入django中的操作,避免循环导入问题from home import modelsyour code write here

启动

celery beat -A celery_task -l info# windows
celery worker -A celery_task -l info -P eventlet# linux
celery worker -A celery_task -l info

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/83844.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RTC晶振两端要不要挂电容

发现GD32的RTC晶振两端需要挂电容&#xff0c;STM32的RTC晶振两端不需要挂电容。 STM32的RTC晶振两端&#xff0c;不需要挂电容&#xff0c;这样晶振启振很容易&#xff0c;挂大了&#xff0c;却难启动&#xff0c;且温度越低&#xff0c;启动越难。 有人说负载电容为6pF的晶振…

分享21年电赛F题-智能送药小车-做题记录以及经验分享

这里写目录标题 前言一、赛题分析1、车型选择2、巡线1、OpenMv循迹2、灰度循迹 3、装载药品4、识别数字5、LED指示6、双车通信7、转向方案1、开环转向2、位置环速度环闭环串级转向3、MPU6050转向 二、调试经验分享1、循迹2、识别数字3、转向4、双车通信5、逻辑处理6、心态问题 …

IoTDB1.X windows运行失败问题的处理

在windows运行 IoTDB1.x时 会出现如图所示的问题 为什么会出现这样的问题&#xff1f;java没有安装还是未调用成功&#xff0c;我是JAVA8~11~17各种更换都未能解决问题&#xff0c;最后对其bat文件进行查看&#xff0c;发现在conf\datanode-env.bat、conf\confignode-env.bat这…

深入学习JVM —— GC垃圾回收机制

前言 前面荔枝已经梳理了有关JVM的体系结构和类加载机制&#xff0c;也详细地介绍了JVM在类加载时的双亲委派模型&#xff0c;而在这篇文章中荔枝将会比较详细地梳理有关JVM学习的另一大重点——GC垃圾回收机制的相关知识&#xff0c;重点了解的比如对象可达性的判断、四种回收…

uniapp+vue3项目中使用vant-weapp

创建项目 通过vue-cli命令行创建项目 Vue3/Vite版要求 node 版本^14.18.0 || >16.0.0 uni-app官网 (dcloud.net.cn) npx degit dcloudio/uni-preset-vue#vite my-vue3-project打开项目 点击顶部菜单栏终端/新建终端 执行安装依赖指令 yarn install 或 npm install 安装vant…

2023年上海国际车展,英信翻译提供中日英同传服务

在2023年4月上海车展期间&#xff0c;日产汽车展示了一系列搭载智能网联技术和电驱动技术的车型&#xff0c;包括首次亮相的Max-Out概念车和专为中国消费者设计的纯电动SUV概念车——日产Arizon。备受全球汽车行业瞩目。 日产是日本第二大汽车公司&#xff0c;也是世界十大汽车…

【山河送书第六期】:《码上行动:零基础学会Python编程( ChatGPT版)》参与活动,送书两本!!

《码上行动:零基础学会Python编程( ChatGPT版》 前言内容提要本书亮点购买链接参与方式往期赠书回顾&#xff1a; 前言 在过去的 5 年里&#xff0c;Python 已经 3 次获得 TIOBE 指数年度大奖&#xff0c;这得益于数据科学和人工智能领域的发展&#xff0c;使得 Python 变得异…

Jmeter响应中的乱码问题

文章目录 问题描述解决办法 问题描述 Jmeter在访问接口的时候&#xff0c;响应内容如果有中文可能会显示乱码 响应页面没有做编码处理&#xff0c;JMeter默认按照ISO-8859-1编码格式进行解析 解决办法 在线程组中添加BeanShell PostProcessor后置处理器 prev.setDataEnco…

量化投研之如何获取所需的数据?

数据是决策和分析的基础&#xff0c;数据的速度、完整性非常重要。 掘金量化提供两大类数据获取方式&#xff1a;订阅数据获取实时数据、接口直通获取历史数据。 下面是两个方式各自的步骤介绍。 获取数据 1. 通过订阅获取高频行情数据 步骤 1、设置初始化函数: init, 使用…

基于Qlearning强化学习的路径规划算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Q值更新规则 4.2 基于Q-learning的路径规划算法设计 4.3 Q-learning路径规划流程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ..…

软件测试面试【富途面经分享】

目录 一面面经&#xff08;1h&#xff09; 二面面经 一面面经&#xff08;1h&#xff09; 一、对白盒黑盒灰盒测试的理解 答&#xff1a; 1、黑盒测试就当整个程序是个黑盒子&#xff0c;我们看不到它里面做了什么事情&#xff0c;只能通过输入输出看是否能得到我们所需的来…

【OpenGauss源码学习 —— 执行算子(SeqScan算子)】

执行算子&#xff08;SeqScan算子&#xff09; 执行算子概述扫描算子SeqScan算子ExecInitSeqScan函数InitScanRelation函数ExecSeqScan函数 总结 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊重他人的知识产权和学术成果&#xff0c;力求遵…

Javascript 正则

基本语法 定义 JavaScript种正则表达式有两种定义方式 构造函数 var regnew RegExp(<%[^%>]%>,g);字面量 var reg/<%[^%>]%>/g;g&#xff1a; global&#xff0c;全文搜索&#xff0c;默认搜索到第一个结果接停止i&#xff1a;ingore case&#xff0c;忽略…

WebRTC | 实现数据流的一对一通信

目录 一、浏览器对WebRTC的支持 二、MediaStream与MediaStreamTrack 三、RTCPeerConnection 1. RTCPeerConnection与本地音视频数据绑定 2. 媒体协商SDP 3. ICE &#xff08;1&#xff09;Candidate信息 &#xff08;2&#xff09;WebRTC收集Candidate &#xff08;3&…

【Matlab】极限学习机-遗传算法(ELM-GA)函数极值寻优——非线性函数求极值

往期博客&#x1f449; 【Matlab】BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值 【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值 【Matlab】RBF神经网络遗传算法(RBF-GA)函数极值寻优——非线性函数求极值 【Matlab】Elman神经网络遗…

MySQL:内置函数、复合查询和内外连接

内置函数 select 函数; 日期函数 字符串函数 数学函数 其它函数 复合查询&#xff08;多表查询&#xff09; 实际开发中往往数据来自不同的表&#xff0c;所以需要多表查询。本节我们用一个简单的公司管理系统&#xff0c;有三张 表EMP,DEPT,SALGRADE来演示如何进行多表查询…

无涯教程-Perl - int函数

描述 此函数返回EXPR的整数元素,如果省略则返回$_。 int函数不进行舍入。如果需要将值四舍五入为整数,则应使用sprintf。 语法 以下是此函数的简单语法- int EXPRint返回值 此函数返回EXPR的整数部分。 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl$int_valint…

使用Spring Initializr方式构建Spring Boot项目

除了可以使用Maven方式构建Spring Boot项目外&#xff0c;还可以通过Spring Initializr方式快速构建Spring Boot项目。从本质上说&#xff0c;Spring lnitializr是一个Web应用&#xff0c;它提供了一个基本的项目结构&#xff0c;能够帮助我们快速构建一个基础的Spring Boot项目…

Telegram营销,全球跨境电商都在研究的营销策略

Telegram 目前有7 亿月活跃用户。作为一个如此流行和广泛的即时通讯平台&#xff0c; Telegram 已成为企业和客户沟通的重要即时通讯工具。 为了使企业能够快速有效地覆盖目标受众&#xff0c;Telegram 不断改进平台&#xff0c;提供一系列功能&#xff0c;例如可定制的自动化…

JVM源码剖析之Java命令行参数全解

最近&#xff0c;有一位网友询问关于Java命令行参数方面的问题&#xff0c;因为在Java中参数有很多种&#xff0c;有不少的读者一直没弄明白&#xff0c;所以特意写下此篇文章。 此篇文章分2大块&#xff0c;第一块是不同参数的解释&#xff0c;第2块就是JVM源码论证&#xff…