精华内容
下载资源
问答
  • sc.exe create 服务名称 binpath= xxxx.exe
  • worker_processes与worker_connections 设置好合适大小,可以提示nginx处理性能,非常重要。 原作者的话: As a general rule you need the only worker with large number of worker_connections, say 10,000 or ...

    worker_processes与worker_connections 设置好合适大小,可以提示nginx处理性能,非常重要。

    原作者的话:
    As a general rule you need the only worker with large number of worker_connections, say 10,000 or 20,000.
    However, if nginx does CPU-intensive work as SSL or gzipping and you have 2 or more CPU, then you may 
    set worker_processes to be equal to CPU number.
    Besides, if you serve many static files and the total size of the files is bigger than memory, then you may 
    increase worker_processes to utilize a full disk bandwidth.
    Igor Sysoev
    
    翻译:
    一般一个进程足够了,你可以把连接数设得很大。(worker_processes: 1,worker_connections: 10,000)
    如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。(worker_processes: CPU核心数)
    或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,以充分利用IO带宽(主要似乎是IO操作有block)
    
    worker_processes,工作进程数
    • 1.默认:worker_processes: 1
    • 2.调大:worker_processes: CPU核心数,(双核4线程,可以设置为4)
    worker_connections,单个工作进程可以允许同时建立外部连接的数量

    数字越大,能同时处理的连接越多

    • 1.默认:worker_connections: 1024
    • 2.调大:worker_connections: 100000,(调大到10万连接)
    worker_connections解析
    • 1.connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。
    • 2.内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。
    • 3.进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,
      nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;
      设置ulimits:ulimit -SHn 65535
    worker_processes 2; 
    worker_rlimit_nofile 65535;
    #pid logs/nginx.pid; 
    events { 
       worker_connections 65535; 
    }
    

    通过 ps -elf | grep nginx 找到 nginx 的worker进程ID
    通过 cat /proc/31613/limits 查看,其中2291是worker进程ID,请注意其中的Max open files

    在这里插入图片描述
    从上面的分析可以看出nginx占用内存小,处理性能高,通过提高服务器的配置,Nginx可以应对更大的连接数

    展开全文
  • Web Worker

    2020-05-27 11:48:35
    Web Worker JavaScript是单线程语言,如果在Js主线程上进行比较耗时的操作,那么不仅异步的事件回调无法正常完成,浏览器的渲染线程也将被阻塞,无法正常渲染页面。Web Worker能够把JavaScript计算委托给后台线程,...

    Web Worker

    JavaScript是单线程语言,如果在Js主线程上进行比较耗时的操作,那么不仅异步的事件回调无法正常完成,浏览器的渲染线程也将被阻塞,无法正常渲染页面。Web Worker能够把JavaScript计算委托给后台线程,线程可以执行任务而不干扰用户界面。

    描述

    worker是使用构造函数创建的一个对象来运行一个Js文件,这个Js文件中包含将在worker线程中运行的代码,worker运行的全局对象不是当前window,专用worker线程运行环境的全局对象为DedicatedWorkerGlobalScope,共享worker线程运行环境的全局对象为SharedWorkerGlobalScope
    worker可以运行任意JavaScript代码,但不能够直接操作DOM节点,也不能使用window对象的默认方法和属性,但是在window对象下的很多方法包括WebSocketsIndexedDB等在worker全局对象中都有实现。
    worker线程与主线程之间的通信是通过postMessage发送消息以及onmessage事件处理函数来接收消息,这个过程中数据并不是被共享而是被复制。
    只要运行在同源的父页面中,worker可以依次生成新的worker。此外worker还可以使用XMLHttpRequest进行网络I/O,但是XMLHttpRequestresponseXMLchannel属性总会返回null

    专用worker

    专用worker仅能被生成它的脚本使用,通过构造函数生成worker,然后通过消息传递机制将数据传递到worker线程计算完毕后再将数据传回进行下一步操作,worker线程的关闭可以在主线程中关闭也可以在worker线程中关闭。

    // 需要开启一个server
    var worker = new Worker('worker.js'); // 实例化worker线程 
    worker.postMessage(1); // 传递消息
    worker.onmessage = function(e){ // 接收消息事件
        console.log(e.data); // 2
        // worker.terminate(); // 关闭worker线程
    }
    
    // worker.js worker线程
    onmessage = function(e) { // worker接收消息
        var v = e.data; 
        console.log(v); // 1
        postMessage(v * 2); // 乘以2并传递消息 // 简单的计算
        // close(); // 关闭worker线程
    }
    

    共享worker

    共享worker可以同时被多个脚本使用,即使这些脚本正在被不同的windowiframe或者worker访问,也就是说可以使用共享worker进行多个浏览器窗口间通信,当然共享worker的通信必须为同源,不能跨域通信。生成共享worker与生成专用worker非常相似,只是构造器的名字不同,他们之间一个很大的区别在于:共享worker必须通过一个确切的打开的端口对象供脚本与worker通信,在专用worker中这一部分是隐式进行的。如果父级线程和worker线程需要双向通信,那么它们都需要调用start()方法,对于消息的传递依然使用postMessage但是必须通过调用端口上的postMessage方法来实现消息通信。

    // 需要开启一个server
    // 页面A 浏览器窗口间通信实例
    var worker = new SharedWorker('worker.js');
    worker.port.start();
    worker.port.postMessage(1);
    
    // 页面B 浏览器窗口间通信实例
    var worker = new SharedWorker('worker.js');
    worker.port.start();
    worker.port.onmessage = function(event){
        console.log(event.data);
    };
    
    // worker.js worker线程
    var portArr = [];
    onconnect = function(e) {
      var port = e.ports[0];
      if(portArr.indexOf(port) === -1) portArr.push(port);
      port.onmessage = function(e) {
        portArr.forEach( v => {
            v.postMessage(e.data);
        })
      }
    }
    

    每日一题

    https://github.com/WindrunnerMax/EveryDay
    

    参考

    https://developer.mozilla.org/zh-CN/docs/Web/API/Worker
    https://developer.mozilla.org/zh-CN/docs/Web/API/SharedWorker
    https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API/Using_web_workers
    
    展开全文
  • Web worker,service worker和worklet,这些都是“JavaScript Workers”,虽然它们在运行方式上有一些相似的地方,并且它们在使用上也有一些重叠的地方。 一般来说,一个worker是一个脚本在浏览器主线程之外的单独的...

    Web worker,service worker和worklet,这些都是“JavaScript Workers”,虽然它们在运行方式上有一些相似的地方,并且它们在使用上也有一些重叠的地方。

    一般来说,一个worker是一个脚本在浏览器主线程之外的单独的线程上运行。如果你想要在HTML文档中引用一个

    Web worker,service worker和worklet都是让脚步运行在单独的线程上的,下面讲一下三者的区别。

    Web workers

    Web workers是最常用的worker类型。它不像另外两种,它们除了运行在主线程外的特性外,没有一个特殊的应用场景。所以,web worker可以用于减少主线程上大量的线程活动。

    在这里插入图片描述

    要使用Web worker,需要使用Web Worker API,创建一个单独的JavaScript文件,将该文件添加到一个新的Worker中。

    /* main.js */
    const myWorker = new Worker('worker.js');
    

    worker.js文件中的任何代码都会开始运行,web worker最有用的是用于减少那些可能需要花费很长时间的工序或者与其他线程上平行运行。一个很好的例子是图片线程web应用:Squoosh,它使用web worker来处理图片处理任务,可以让主线程有精力处理用户与应用的交互而不被打扰。

    像所有的worker,web worker没有获取DOM的权限,这意味着任何需要的信息将被在worker和主脚本间传递,传递参数使用window.postMessage()。

    /* main.js */线程
    
    // 创建 worker
    const myWorker = new Worker('worker.js');
    
    // 向 worker 传递信息
    myWorker.postMessage('Hello!');
    
    // 接收从 worker 传递过来的信息
    myWorker.onmessage = function(e) {
      console.log(e.data);
    }
    

    在worker脚本中,我们可以监听主脚本中的消息,并将响应返回。

    /* worker.js */
    
    // 接收主文件的信息
    self.onmessage = function(e) {
      console.log(e.data);
    
      // 向主文件发送信息
      self.postMessage(workerResult);
    }
    

    Service workers

    Service workers 是一种提供详细的作为浏览器和网络或缓存间的代理的服务。

    在这里插入图片描述

    与Web worker类似,service worker 是在主脚本文件中注册,引用到一个专门的service worker文件。

    /* main.js */
    navigator.serviceWorker.register('/service-worker.js');
    

    与一般的web worker不同,service worker有一些额外的特性来实现代理的目的。只要它们被安装且被激活,service worker就可以拦截主文档中发起的任何网络请求。

    /* service-worker.js */
    
    // Install (安装)
    self.addEventListener('install', function(event) {
        // ...
    });
    
    // Activate (激活)
    self.addEventListener('activate', function(event) {
        // ...
    });
    
    // 监听主文档中的网络请求
    self.addEventListener('fetch', function(event) {
        // ...
    });
    

    只要一被拦截,service worker就可以返回一个缓存中的文档作为响应,而不用走网络请求,因此可以让应用离线运行。

    /* service-worker.js */
    
    self.addEventListener('fetch', function(event) {
        // 返回缓存中的数据
        event.respondWith(
            caches.match(event.request);
        );
    });
    

    Worklets

    Worklet 是一个非常轻量且高度特别的worker。它可以让开发者在浏览器渲染线程中的多个部分做钩子。

    当一个web页面正在被渲染,浏览器经过很多步骤。在我的文章“Understanding the Critical Rendering Path”中有更加详细的介绍,在这里我们需要关注有四步:Style,Layout,Paint和Composite。

    在这里插入图片描述

    我们来看Paint这一步吧,这一步是浏览器应用每个元素的样式。在渲染的这一步做钩子的worklet是 Paint Worklet。

    Paint Worklet允许我们创建自定义图片,这个图片可以应用任何CSS,比如background-image属性的值。

    为了创建worklet,我们想其他worker一样在主脚本文件中注册它,并引用到单独的worklet文件。

    /* main.js */
    CSS.paintWorklet.addModule('myWorklet.js');
    

    在worklet文件中,我们可以创建自定义图片,paint函数像Canvas API一样工作。下面例子中,我们实现一个黑色到白色的渐变。

    /* myWorklet.js */
    
    registerPaint('myGradient', class {
      paint(ctx, size, properties) {
        var gradient = ctx.createLinearGradient(0, 0, 0, size.height / 3);
    
        gradient.addColorStop(0, "black");
        gradient.addColorStop(0.7, "rgb(210, 210, 210)");
        gradient.addColorStop(0.8, "rgb(230, 230, 230)");
        gradient.addColorStop(1, "white");
    
        ctx.fillStyle = gradient;
        ctx.fillRect(0, 0, size.width, size.height / 3);
      }
    });
    

    最后,我们可以在我们CSS中应用这个新的worklet,而且我们创建的这个自定义图片将会应用起来其他任何图片背景。

    div {
        background-image: paint(myGradient);
    }
    

    除了Paint Worklet之外,还有其他的worklet可以向渲染线程的其他阶段做钩子。Animation Worklet在Composite阶段做钩子,Layout Worklet在Layout阶段做钩子。

    总结

    Web worker,Service worker和worklet都是将脚本运行在浏览器主线程之外单独的线程中,它们之间的区别是它们所应用的场景和他们的特性。

    Worklet 是浏览器渲染流中的钩子,可以让我们有浏览器渲染线程中底层的权限,比如样式和布局。

    Service worker 是浏览器和网络间的代理。通过拦截文档中发出的请求,service worker 可以直接请求缓存中的数据,达到离线运行的目的。

    Web worker 是通常目的是让我们减轻主线程中的密集处理工作的脚本。

    展开全文
  • kthread worker

    千次阅读 2018-12-01 16:43:52
    kthread worker 起始就是kernel 帮用户开创建内核线程,简化复杂度。 主要的函数有三个,其使用举例如下: 创建一个worker: pool->worker = kthread_create_worker(0, "ib_fmr(%s)", device-&...
    kthread worker 起始就是kernel 帮用户开创建内核线程,简化复杂度。
    主要的函数有三个,其使用举例如下:
    创建一个worker:
    pool->worker = kthread_create_worker(0, "ib_fmr(%s)", device->name);
    给worker 分配工作
    	kthread_init_work(&pool->work, ib_fmr_cleanup_func);
    让worker 开始工作
    		kthread_queue_work(pool->worker, &pool->work);
    
    kthread worker 其实就是内核进程。具体我们看看kthread_create_worker的实现就明白了
    
    kthread_create_worker->__kthread_create_worker
    static __printf(3, 0) struct kthread_worker *
    __kthread_create_worker(int cpu, unsigned int flags,
    			const char namefmt[], va_list args)
    {
    	struct kthread_worker *worker;
    	struct task_struct *task;
    	int node = -1;
    
    	worker = kzalloc(sizeof(*worker), GFP_KERNEL);
    	if (!worker)
    		return ERR_PTR(-ENOMEM);
    
    	kthread_init_worker(worker);
    
    	if (cpu >= 0)
    		node = cpu_to_node(cpu);
    #核心就是这行,创建一个内核线程
    	task = __kthread_create_on_node(kthread_worker_fn, worker,
    						node, namefmt, args);
    	if (IS_ERR(task))
    		goto fail_task;
    
    	if (cpu >= 0)
    		kthread_bind(task, cpu);
    
    	worker->flags = flags;
    	worker->task = task;
    #唤醒这个线程
    	wake_up_process(task);
    	return worker;
    
    fail_task:
    	kfree(worker);
    	return ERR_CAST(task);
    }
    给work赋值如下,可以看到就是给work->func赋值
    #define kthread_init_work(work, fn)					\
    	do {								\
    		memset((work), 0, sizeof(struct kthread_work));		\
    		INIT_LIST_HEAD(&(work)->node);				\
    		(work)->func = (fn);					\
    	} while (0)
    最后看一下如果让kthread worker来执行用户的回调函数
    bool kthread_queue_work(struct kthread_worker *worker,
    			struct kthread_work *work)
    {
    	bool ret = false;
    	unsigned long flags;
    
    	spin_lock_irqsave(&worker->lock, flags);
    	if (!queuing_blocked(worker, work)) {
    #原来就是讲第二步的woker挂到worker->work_list 列表中
    		kthread_insert_work(worker, work, &worker->work_list);
    		ret = true;
    	}
    	spin_unlock_irqrestore(&worker->lock, flags);
    	return ret;
    }
    static void kthread_insert_work(struct kthread_worker *worker,
    				struct kthread_work *work,
    				struct list_head *pos)
    {
    	kthread_insert_work_sanity_check(worker, work);
    
    	list_add_tail(&work->node, pos);
    	work->worker = worker;
    	if (!worker->current_work && likely(worker->task))
    #唤醒这个kthread 开始工作
    		wake_up_process(worker->task);
    }
    个人认为kthread worker主要减少用户创建内核线程的个数,通过上面的例子看一个kthread worker中可以执行多个回调函数

     

    展开全文
  • 这个新特性叫做Web Worker (在此之前没有多线程,setTimeout等本质仍然是单线程) 虽然是多线程编程 不过我们不用担心传统的多线程语言C++、Java等等遇到的多线程问题 下面我们就来看看什么是Web Worker工作...
  • web worker的介绍和使用

    万次阅读 热门讨论 2020-10-29 09:30:44
    什么是web worker呢?从名字上就可以看出,web worker就是在web应用程序中使用的worker。这个worker是独立于web主线程的,在后台运行的线程。 web worker的优点就是可以将工作交给独立的其他线程去做,这样就不会...
  • ServiceWorker

    千次阅读 2017-08-15 21:38:22
    什么是ServiceWorker websocket是H5的新API,是一段运行在浏览器后台的JavaScript脚本,独立于当前页面,因此不能和网页交互,它可以拦截和处理网络请求,实现缓存资源并在离线时响应用户的请求。 ServiceWorker...
  • thinkphp 启动worker

    2021-04-29 16:42:16
    php think worker:server start 未配置环境变量 /usr/bin/php73 think worker:server start 守护进程启动 /usr/bin/php73 think worker:server -d 修改代码就要重启服务 /usr/bin/...
  • webWorker

    2017-07-07 15:55:37
    通过webworker可在浏览器后台运行JavaScript,而不占用浏览器自身线程,一般JavaScript和页面UI共用一个线程,webworker相当于在后台启动一个线程 webworker无法访问DOM节点 无法访问全局变量或者函数 不能...
  • Workera报告

    千次阅读 2020-03-16 21:35:08
    Workera报告
  • worker_processes:操作系统启动多少个工作进程运行Nginx 注意是工作进程,不是有多少个nginx工程。在Nginx运行的时候,会启动两种进程,一种是主进程master process;一种是工作进程worker process。 例如我在配置...
  • Spark Worker 原理 Worker 启动 Driver 源码鉴赏 Worker 启动 Executor 源码鉴赏 Worker 与 Master 的交互关系   [引言部份:你希望读者看完这篇博客后有那些启发、学到什么样的知识点] 更新中......   ...
  • worker 理解

    2019-07-11 17:10:54
    JavaScript为单线程,worker则为JavaScript创建多线程环境。 使用场景如:计算文件hash,计算大于1G的文件hash过程是很慢的,但由于要将hash传给后端,所有需要在计算完成以后,再请求后端接口 fast_upload,请求 ...
  • web-worker使用import web-worker+ES6问题 首先type 必须等于 ‘module’ new Worker('Worker.js', {type: 'module'}) 注意: 如果你引入的 ‘Worker.js’ 有任何引入问题. 控制台 不会有任何提示web-worker 会在...
  • GatewayWorker流程

    千次阅读 2019-12-20 13:45:55
    GatewayWorker流程 手里的项目遇到个需求,就了解了一下GatewayWorker。本来打算用这个了,但是最后还是选择了workerman。简单说一下GatewayWorker流程吧 因为项目需求用的php做设备通信。设备客户端使用tcp进行长...
  • nginx worker_processes 和worker_connections

    千次阅读 2018-10-31 13:59:51
    worker_processes:操作系统启动多少个工作进程运行Nginx。注意是工作进程,不是有多少个nginx工程。在Nginx运行的时候,会启动两种进程,一种是主进程master process;一种是工作进程worker process。   worker_...
  • WebWorker简介

    2019-10-20 23:27:42
    什么是WebWorker 为什么要使用WebWorker WebWorker兼容性如何 WebWorker能用来做什么 如何使用WebWorker importScripts .WebWorker的其他类型介绍 1.什么是WebWorker WebWorker是运行在后台的javascript,独立于...
  • web worker

    2017-04-22 11:59:57
    Web Workers 是 HTML5 提供的一个javascript多线程解决方案,我们可以将一些大计算量的代码交由...Web Worker可以提高应用的总体性能,并且提升用户体验。 学习自: 原文1 原文2//test.html <!DOCTYPE HTML> <he
  • 2. Worker启动流程 创建worker对象 a. worker内存中的数据结构(主要是drivers、executors) b. worker中的线程 c. onStart()函数 d. 向master注册worker信息 3 receive*() worker消息循环 1 ...
  • Swoole Worker事件

    2019-06-26 16:14:08
    onWorkerStart 原型 function onWorkerStart(swoole_server $server, int ...$worker_id是一个从[0 - $worker_num) 区间内的数字,表示这个Worker工作进程的编号。 $worker_id和进程PID没有任何关系,可使用posix_g...
  • web worker使用

    2019-06-23 17:32:38
    JavaScript的一个特性就是单线程,web worker的出现解决了JavaScript无法多线程的问题,定义了“Worker”来执行代码的并行线程。 web worker有许多使用上的限制: 1、web worker中无法访问window对象和document...
  • Web Worker 使用指南

    2020-02-20 23:31:16
    Web Worker 是 HTML5 新出的标准。...在 JavaScript 中,主线程可以创建多个 Worker 子线程。Worker 子线程不影响主线程的执行,也就是不影响页面交互,只在后台运行,等到计算完成,再把结果返回给主线程。
  • ActionScript Worker

    2017-04-19 21:20:10
    package { import flash.display.Sprite; import flash.events.Event; import flash.system.MessageChannel;... import flash.system.Worker; import flash.system.WorkerDomain; import flash.utils.setInterval
  • worker 多线程

    2019-08-14 10:38:02
    Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把...
  • 告诉nginx收到一个新连·接通知后接受尽可能多的连接,默认是on,设置为on后,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,设置为off后,多个worker按并行方式来处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,376
精华内容 36,950
关键字:

worker