V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  h0099  ›  全部回复第 8 页 / 共 9 页
回复总数  166
1  2  3  4  5  6  7  8  9  
2023-01-11 22:42:07 +08:00
回复了 Jamy 创建的主题 Linux 如何给 sh -c "echo $1,$2" 传递参数。
@webcape233 估计他复制粘贴来的 bash 里有一大堆的$1 $2 $3 $4 $5 $6 $7 $8 $9 他懒得查找替换,而您又不可能声明 1=a ( bash 变量名不能数字开头)
2023-01-11 21:36:16 +08:00
回复了 Jamy 创建的主题 Linux 如何给 sh -c "echo $1,$2" 传递参数。
https://unix.stackexchange.com/questions/144514/add-arguments-to-bash-c
第一个回答的机翻:

/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
在第一种情况下,显式传递 echo 参数$0 和$1 ,在第二种情况下,使用"$@"to 正常扩展为“除 $0 之外的所有位置参数”。请注意,在这种情况下,我们也必须传递一些要使用的东西$0 ;我选择了“bash”,因为这$0 通常是什么,但其他任何东西都可以。

至于这样做的原因,而不是仅仅将您直接提供的任何参数传递给您列出的命令:请注意文档说“命令是从字符串中读取的”,复数形式。换句话说,这个方案允许你做:

/bin/bash -c 'mkdir -p -- "$1" && cd -P -- "$1" && touch -- "$2"' bash dir file
2023-01-11 21:29:37 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
@biguokang 建议深入学习贯彻泛银河系格雷科技分部邪恶组织四叶重工炼铜本部叶独头子叶独群组联合体陈意志第三帝国元首炼铜傻狗橙猫领导下的四叶 TG 本部( https://t.me/n0099_tg https://t.me/n0099official )话语体系文风:
https://sora.ink/archives/1574
https://github.com/n0099/TiebaMonitor/issues/24
https://github.com/Starry-OvO/aiotieba/issues/64
2023-01-11 21:26:42 +08:00
回复了 shendaowu 创建的主题 MySQL 如何防止大量耗时的数据库查询影响网页加载速度?
2023-01-11 21:25:52 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
#8 @shendaowu 通过控制进程的资源用量使得您也可以在一个系统上跑两个 mysqld
#10 @lululau 很明显他只是装个现有的程序来跑所以无法修改其内部结构 https://www.v2ex.com/t/908246
2023-01-11 20:53:03 +08:00
回复了 shendaowu 创建的主题 MySQL mysql 或者 mariadb 能不能限制某条语句的资源消耗?
可以基于#6 所说的单独开个 mysqld 进程作为只读 replicate 服务端
然后修改`innodb_buffer_pool_size`( https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size )和`innodb_redo_log_capacity`/`innodb_log_file_size`以约束进程常驻占用内存量: https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html#innodb-modifying-redo-log-capacity
根据每个 sql 的特点可能会产生巨大的临时表( https://dev.mysql.com/doc/refman/8.0/en/internal-temporary-tables.html ),您可以把默认 1G 的`temptable_max_ram`也调低 https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_temptable_max_ram
限制进程硬盘 io: https://unix.stackexchange.com/questions/48138/how-to-throttle-per-process-i-o-to-a-max-limit
限制进程 cpu 使用率: https://manpages.ubuntu.com/manpages/trusty/man1/cpulimit.1.html
2023-01-11 20:45:29 +08:00
回复了 GGGG430 创建的主题 MySQL sql 中包含特殊字符问题
另外如果您要导入的这个几百 m 的文件是合法的 csv (但您说`包含很多 mysql 保留字或者其他特殊字符,那大概率也有一大堆的,`),那您可以试试 LOAD DATA INFILE https://dev.mysql.com/doc/refman/8.0/en/load-data.html
2023-01-11 20:42:09 +08:00
回复了 GGGG430 创建的主题 MySQL sql 中包含特殊字符问题
难道您还在手动拼接 raw sql ?要是这几百 m 的字符串里正好有个`; DROP DATABASE 您的库名;`呢?
2023-01-11 20:11:50 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
那就直接把 event loop 视作 FIFO stack
https://i.imgur.com/6v8EAF1.png
您每次 setTimeout/Interval 或创建 Promise (不论 new 还是 Promise.reslove/reject())都是 push 了一个回调进 stack
等您导致 push tsack 的这些同步 js 代码都执行完了之后 js 主线程空闲时就会去 pop stack 取出回调来逐个执行
这也不需要去阅读理解有关 spec html.spec.whatwg.org/multipage/webappapis.html#task-queue 中的 micro/marcotask 概念 stackoverflow.com/questions/25915634/difference-between-microtask-and-macrotask-within-an-event-loop-context
请不要在每一个回复中都包括外链,这看起来像是在 spamming
2023-01-11 17:42:46 +08:00
回复了 jaredyam 创建的主题 Java 这段随机数生成代码为什么这么写?
2023-01-11 17:34:04 +08:00
回复了 h0099 创建的主题 程序员 如何从理论上避免这类并行任务交错执行时的冲突问题
> 但不论 UPSERT 还是 IGNORE 都是从数据库层面缓解问题,他不是保证永不发生 DUPLICATE 错误

如果要从数据库层面解决可以尝试
7.`SELECT ... FOR UPDATE`语法所产生的`插入意向排他锁`
---
https://i.imgur.com/sH4wlWZ.png
线程 1 和 2 每次 SELECT 时都通过 WHERE 子句(只取 field=a 的行)缩小了`FOR UPDATE`所造成的[IX 锁]( https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_intention_exclusive_lock)的范围(不然没有 WHERE 我怀疑会锁全表,也就是类似于[`LOCK TABLES ... WRITE`]( https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html))
线程 2 在执行后必须无限期(直到达到[innodb_lock_wait_timeout]( https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_lock_wait_timeout))等待线程 1`COMMIT`,因为线程 2 想要 SELECT 的行`field=a`已于此前被线程 1 设置 IX 锁
不难看出此时进程范围的全局锁(进程锁)已经没有存在的必要了,因为他的目的跟 IX 锁是类似的(但他无法目前像 IX 锁那样无限期阻塞任何试图读取进程锁的线程)
实际上 IX 锁同样降低了并行度,因为这跟原文中提出的`1.延后线程 2 查询数据库的时机`是类似的目的:
都是将任何试图读取某些行(`IX 锁`是 field=a 的行,`1.延后线程 2`是所有行,也就是回到了`LOCK TABLES`)的线程挂起直至正在写入某些行的其他线程`COMMIT`
也就是说两者都是试图通过[serialize]( https://en.wikipedia.org/wiki/Serializability)最开始读行的过程从而避免后续`INSERT`时冲突

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-intention-locks
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-insert-intention-locks
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
https://stackoverflow.com/questions/21261213/select-for-update-with-insert-into
https://stackoverflow.com/questions/10935850/when-to-use-select-for-update

但人生自古谁无死,不幸地,截止 2022 年 11 月发布的最新版本`EFCore 7`,我所使用的.NET 企业级 ORM `Entity Framework Core`中仍未引入任何原生的 IQueryable<T> linq2sql operator 使得其可以被翻译为追加在`SELECT`末尾的`FOR UPDATE`: https://github.com/dotnet/efcore/issues/26042#issuecomment-993534289
目前能用的变通只有额外查询 rawsql 来表示 IX 锁(而不能直接嵌入已有的 linq2sql 中): https://stackoverflow.com/questions/37984312/how-to-implement-select-for-update-in-ef-core
2023-01-11 16:51:08 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
> 要把 js 引擎和浏览器分开来,js 引擎负责解析 js 代码,浏览器才是最终真正干活的东西,这两者不是一体的。

分开理解 v8 和 chromium 最简单的方式就是去用 njs ,njs 环境下有浏览器 api 吗?您能在 njs 里去操作根本不存在的 dom 吗?

> 当 js 引擎执行完所有的同步代码之后,你可以理解为 js 引擎唯一的工作就是,等浏览器踢一脚去执行队列里对应的回调函数。

setTimeout 是在往 loop 追加了一个应该在未来执行的 task ,而`delay: 0`参数只是意味着 loop 应该挂起这个 task 等到 0ms 后再执行( 0ms 也就是不等待)
但不论是传入 setTimeout 还是 Promise.reslove 的回调都是在未来才会发生的,所以才必须等到 console.log(1 和 3)两个同步调用都执行完(也就是整个`console.log(1) setTimeout console.log(3)`)后才会再去执行 loop 中已有的应该在未来执行的 task (在这里就是 setTimeout 的回调 console.log(2))

> js 引擎是单线程的,本身也没有计时、网络请求之类的功能,他的任务也只是把活交给浏览器去干。相对于的 nodejs 也一样。

准确地说是 v8 解释器解释执行 js 时是跑在一个 os thread 内部的
2023-01-11 16:05:55 +08:00
回复了 hemingyang 创建的主题 Oracle 请问 SQL 跟新大量数据怎么处理快呢?
看看 EXPLAIN SELECT tcz.KCXZ FROM T_J20230106 tcz WHERE T.ID=tcz.ID AND T.KCXZ!=tcz.KCXZ 是不是 full table scan
2023-01-11 15:59:04 +08:00
回复了 PrilgrimLi 创建的主题 Google google maps 定位不准
2023-01-11 15:55:40 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
#19 @biguokang
> 是 js 代码通过调用浏览器 web api 从而调用 c++的过程,表面上你写的是 js 代码,但最后实际上干活的是 c++,这个道理放在 nodejs 也同理。

实际上`干活的`涉及许多层级,chromium 的 cpp 代码实际上也是调包特定 os 提供的各种异步 io api 和 syscall ,渲染同理(如果涉及硬件加速还需要通过 ogl/dx 间接的让显卡驱动去跟更多的硬件通信)

> 踢了一下 js 引擎,说我活干完了,你可以执行任务等待队列里的对应回调函数了。

这就是 event loop/message queue

#20 @autoxbc > OP 混淆了 JS 线程和 JS 引擎线程,JS 是单线程,引擎执行完下载,后续代码自然需要回到 JS 线程继续。JS 编码应该保持 JS 视角,只观察引擎提供的接口,不关心引擎实现的细节

js 目前的主流解释器 v8 引擎只是一个 js 解释器,他同样不负责浏览器层面的那些网络请求 ui 渲染等任务
2023-01-11 15:50:07 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
#18 @yezheyu
> 所以 xhr 只是负责和浏览器的网络线程通信,下发任务

xhr/fetch 是浏览器暴露的一套 api ,以允许您去指挥网络线程发起 http request
然而很明显在一个单纯的`<img src="url">`中不存在任何`<script>`中的 js 代码去通过 xhr/fetch api 请求这个 url
因此在这里实际上只有 html parser 在请求图片 url ,而后 network thread 再把 url 的 response body 传输给渲染图片的 thread ,还有可能导致 css reflow
建议复习
https://www.chromium.org/developers/design-documents/displaying-a-web-page-in-chrome/
https://www.chromium.org/developers/design-documents/multi-process-architecture/
https://www.chromium.org/developers/design-documents/multi-process-resource-loading/
https://chromium.googlesource.com/chromium/src/+/master/docs/how_cc_works.md

> 对于下载好的资源,你怎么处理,就算只是打印一下,也必须让主线程处理。

如果阁下所说的`打印一下`是指`console.log(await(await fetch('https://www.v2ex.com')).text())`这样的 js 代码,那么 network thread 当然会把 response body 传回给 js thread 从而作为您所调用的的`Response.text()`返回的 promise 的 reslove 值

> 对于结果不管是更新 UI ,还是打印结果,都只能是主线程处理

但如果您没有在 js 中消费这个 Response 对象那不会有任何 byte[]被从 network thread 传输到您的 js thread 上,例如`console.log(await fetch('https://www.v2ex.com'))`
而对于最开始的例子 一个单纯的`<img src="url">` 这里同样没有任何 js 的存在,即上文所说的:
> 要么是其他浏览器 thread 消费,比如有一个`<img src="url">`,那么 network thread 下载完了`url`后就会把 byte[]传给负责图片渲染和 css layout 的 thread ,让他们绘制这个<img>,这里同样没有 js 的事(即便您禁用了浏览器 js 也不会妨碍<img src>正常工作)
回顾经典之
https://officechai.com/news/developer-asks-javascript-question-twitter-javascript-founder-steps-help/
https://twitter.com/BrendanEich/status/818570098998800388

另外 php 创始人 Rasmus Lerdorf 并不懂现代 php 生态圈,如 https://news.ycombinator.com/item?id=1044280 https://news.ycombinator.com/item?id=6919248
您不如去致电在 jetbrains 任职开发 phpstorm 时( php7~php8 时代)为 php-src 做出大量贡献的 Nikita Popov
2023-01-11 14:13:30 +08:00
回复了 h0099 创建的主题 程序员 如何从理论上避免这类并行任务交错执行时的冲突问题
原地 UPDATE 为原值跟 INSERT IGNORE 是类似的
只不过完全静默了 WARN (而 INSERT IGNORE 是将 DUPLICATE ERR 降至 WARN )
2023-01-11 14:09:34 +08:00
回复了 yezheyu 创建的主题 程序员 关于异步任务的一点疑问,有没有老哥帮忙解答下
> 那你在代码中的耗时任务该怎么办呢? js 又没有多线程让你开辟一个线程去处理,而浏览器也没有一个特定的 WEB API 帮你执行。

现在您可以使用 web worker 标准的 api https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers 来创建新的 js/wasm thread 来跑您的 cpu 密集耗时任务

> 所以为了不阻塞后续代码只能延期执行,让其它代码先执行,执行完后再执行耗时任务和对其结果的依赖代码,即微任务。

这就是异步

> 每个宏任务都有一个微任务队列,里面放的就是这些延期代码。微任务的执行时机就是当前宏任务执行完,下一个宏任务执行前。这样就可以完美解决。

mirco/macrotask 是 html spec 中标准化了的对 js thread 上的 event loop 和异步调度的优先级实现: https://stackoverflow.com/questions/25915634/difference-between-microtask-and-macrotask-within-an-event-loop-context

> 而 Promise 就是这样的实现

promise 是无栈协程,也就是说他本质上跟回调地狱异步没有区别(这也是为什么 es6 spec 标准化 promise 之前有 jq promise https://api.jquery.com/category/deferred-object/ 、promises/a+ https://promisesaplus.com/ 等各种民间标准,但他们的本质都是对回调地狱的封装使其更好读)
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1013 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 27ms · UTC 20:47 · PVG 04:47 · LAX 12:47 · JFK 15:47
Developed with CodeLauncher
♥ Do have faith in what you're doing.