小编Bor*_*lov的帖子

到底是什么让 Java 虚拟线程变得更好

我对 Loom 项目非常感兴趣,但有一件事我无法完全理解。

\n

大多数 Java 服务器使用具有一定线程限制(200、300 ..)的线程池,但是,您不受操作系统的限制可以产生更多线程,我已经读到,通过针对 Linux 的特殊配置,您可以达到巨大的数量。

\n

操作系统线程成本更高,启动/停止速度更慢,必须处理上下文切换(按数量放大),并且您依赖于操作系统,而操作系统可能拒绝为您提供更多线程。

\n

话虽如此,虚拟线程也消耗类似数量的内存(或者至少我是这么理解的)。使用 Loom,我们可以进行尾部调用优化,这应该会减少内存使用。另外,同步和线程上下文复制应该仍然是一个类似大小的问题。

\n

事实上,您可以生成数百万个虚拟线程

\n
public static void main(String[] args) {\n    for (int i = 0; i < 1_000_000; i++) {\n        Thread.startVirtualThread(() -> {\n            try {\n                Thread.sleep(1000);\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        });\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当我使用平台线程时,上面的代码在 25k 左右中断并出现 OOM 异常。

\n

我的问题是,到底是什么让这些线程如此轻量,是什么阻止我们生成 100 万个平台线程并使用它们,是否只是上下文切换使常规线程如此“重”。

\n

一个非常相似的问题

\n

到目前为止我发现的事情:

\n
    \n
  • 上下文切换的成本很高。一般来说,即使在操作系统知道线程如何表现的理想情况下,它仍然必须为每个线程提供平等的执行机会,因为它们具有相同的优先级。如果我们生成 10k 操作系统线程,它将必须不断地在它们之间切换,并且在某些情况下,仅此任务就可以占用高达 80% 的 CPU 时间,因此我们必须非常小心这些数字。使用虚拟线程,上下文切换由 JVM 完成,这使得它基本上是免费的
  • \n
  • 便宜的启动/停止。当我们中断一个线程时,我们本质上是告诉任务“杀死正在运行的操作系统线程”。但是,例如,如果该线程位于线程池中,那么当我们请求时,该线程可能会被当前任务释放,然后交给另一个任务,而另一个任务可能会收到中断信号。这使得中断过程相当复杂。虚拟线程只是存在于堆中的对象,我们可以让 GC …

java multithreading project-loom

27
推荐指数
2
解决办法
5992
查看次数

Keycloak缺少表单参数:grant_type

我在本地计算机上运行了独立的keycloak。

我创建了一个名为“ spring-test”的新领域,然后创建了一个名为“ login-app”的新客户端

根据其余文档:

POST: http://localhost:8080/auth/realms/spring-test/protocol/openid-connect/token

{
    "client_id": "login-app",
    "username": "user123",
    "password": "pass123",
    "grant_type": "password"
}
Run Code Online (Sandbox Code Playgroud)

应该给我jwt令牌,但是我收到了错误的请求并做出了回应

{
    "error": "invalid_request",
    "error_description": "Missing form parameter: grant_type"
}
Run Code Online (Sandbox Code Playgroud)

我假设我的配置中缺少某些内容。

编辑:我正在使用json正文,但它应该是形式url编码:以下正文有效:

token_type_hint:access_token&token:{token}&client_id:{client_id}&client_secret:{client_secret}
Run Code Online (Sandbox Code Playgroud)

java authentication login keycloak

15
推荐指数
4
解决办法
7423
查看次数

Keycloak社交登录休息api

我已经为我的 keycloak 实例启用了谷歌社交登录,但我需要将它用作休息服务。

是否有可用于执行此操作的端点?

java authentication rest keycloak

11
推荐指数
1
解决办法
871
查看次数

使用 Doc2Vec 测量两个文档之间的相似性

我已经训练了 gensim doc2Vec 模型,它可以找到与未知文档最相似的文档。

现在我需要找到两个未知文档之间的相似度值(它们不在训练数据中,所以它们不能被 doc id 引用)

d2v_model = doc2vec.Doc2Vec.load(model_file)

string1 = 'this is some random paragraph'
string2 = 'this is another random paragraph'

vec1 = d2v_model.infer_vector(string1.split())
vec2 = d2v_model.infer_vector(string2.split())
Run Code Online (Sandbox Code Playgroud)

在上面的代码中 vec1 和 vec2 被成功初始化为一些值和大小 - 'vector_size'

现在查看 gensim api 和示例,我找不到适合我的方法,他们都期待 TaggedDocument

我可以按值比较特征向量值,如果它们更接近 => 文本更相似吗?

python nlp machine-learning gensim doc2vec

6
推荐指数
1
解决办法
6214
查看次数

Jackson 为所有日期字段设置全局日期格式

我正在从事非春季启动项目。

有大量的数据对象,使用 JsonFormat 注释所有日期字段开始变得不方便。

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = JacksonSerialiser.DATE_FORMAT)
private Date someDate;
Run Code Online (Sandbox Code Playgroud)

我知道我可以直接在 ObjectMapper 上设置日期格式

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_FORMAT);
OBJECT_MAPPER.setDateFormat(simpleDateFormat);
Run Code Online (Sandbox Code Playgroud)

如果所有序列化/反序列化都是直接使用对象映射器完成的,则此方法有效。

您可以通过扩展来实现 CustomDateSerializer StdSerializer<Date>,但为了应用格式,您需要在字段级别指定它,如下所示:

@JsonSerialize(using = CustomDateSerializer.class)
public Date someDate;
Run Code Online (Sandbox Code Playgroud)

对于 Spring Boot,您可以使用以下属性:

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
Run Code Online (Sandbox Code Playgroud)

如果我可以在没有弹簧的情况下设置这样的属性,那就太好了。

java serialization json date jackson

5
推荐指数
1
解决办法
4623
查看次数

千分尺计数器与分布总结

使用摘要来跟踪我要跟踪的请求大小

  • 请求总数
  • 总请求大小
  • 最大请求大小

我可以这样做

meterRegistry.summary("request.size", <tag for url>).record(<size>);
Run Code Online (Sandbox Code Playgroud)

不过,我可以使用计数器和最大尺寸的仪表来实现相同的目的

meterRegistry.counter("request.size.total", <tag for url>).increment(<size>);
meterRegistry.counter("request.size.count", <tag for url>).increment();
meterRegistry.gauge("request.size.max", <tag for url>).set(<new value if needed>);
// and the gauge value will be stored in atomic variable
Run Code Online (Sandbox Code Playgroud)

问题是,与较长的解决方案相比,摘要除了更短之外还有什么好处吗?

java monitoring metrics prometheus micrometer

5
推荐指数
1
解决办法
5024
查看次数

C++ ostringstream奇怪的行为

我最近对c ++代码有一个非常奇怪的问题.我以简约的例子再现了这个案例.我们有一个Egg类:

class Egg
{
private:
    const char* name;
public:
    Egg() {};
    Egg(const char* name) {
        this->name=name;
    }
    const char* getName() {
        return name;
    }
};
Run Code Online (Sandbox Code Playgroud)

我们还有一个篮子类来举行鸡蛋

const int size = 15;
class Basket
{
private:
    int currentSize=0;
    Egg* eggs;
public:
    Basket(){
        eggs=new Egg[size];
    }
    void addEgg(Egg e){
        eggs[currentSize]=e;
        currentSize++;
    }
    void printEggs(){
        for(int i=0; i<currentSize; i++)
        {
            cout<<eggs[i].getName()<<endl;
        }
    }
    ~Basket(){
        delete[] eggs;
    }
};
Run Code Online (Sandbox Code Playgroud)

所以这里是按预期工作的示例.

 Basket basket;
 Egg egg1("Egg1");
 Egg egg2("Egg2");

 basket.addEgg(egg1);
 basket.addEgg(egg2);
 basket.printEggs();
 //Output: Egg1 Egg2
Run Code Online (Sandbox Code Playgroud)

这是预期的结果,但如果我想根据一些循环变量添加生成名称的N个蛋,我有以下问题. …

c++ string pointers stream ostringstream

4
推荐指数
1
解决办法
128
查看次数

Word2Vec如何确保反义词在向量空间中相隔很远

从广义上讲,word2vec的训练是一个过程,在这个过程中,通常在同一个上下文中的单词在向量空间中聚集在一起.我们首先随机改变平面上的单词然后随着每次迭代形成越来越多的集群.我想我理解了这一点,但是我们怎样才能确保反义词或很少出现在同一语境中的词语最终不会出现在附近的群集中?另外,我们怎么能知道更无关紧要的词语比不那么无关紧要的词语更远.

nlp machine-learning word2vec

2
推荐指数
1
解决办法
242
查看次数

Angular 7. ngx-material-timepicker,切换按钮未正确对齐

我正在使用ngx-material-timepicker创建日期和时间选择器。

这是我模板的相关部分。(我没有组件的额外 css)

<div class="container">
  <div class="row">
    <div class="col-sm-6">
      <mat-form-field>
        <input
          matInput
          [matDatepicker]="picker"
          placeholder="Choose a date"
          [min]="minDate"
          [(ngModel)]="chosenDate"
          (ngModelChange)="dateChanged()"
        />
        <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
        <mat-datepicker #picker></mat-datepicker>
      </mat-form-field>
    </div>
    <div class="col-sm-6">
      <mat-form-field>
        <input
          matInput
          [ngxTimepicker]="timePick"
          placeholder="Chose time"
          [min]="minTime"
          [(ngModel)]="chosenTime"
          (ngModelChange)="timeChanged()"
        />
        <ngx-material-timepicker-toggle
          [for]="timePick"
        ></ngx-material-timepicker-toggle>
        <ngx-material-timepicker
          [defaultTime]="minTime"
          #timePick
        ></ngx-material-timepicker>
      </mat-form-field>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

在此处输入图片说明

日期选择器工作正常,但时间选择器的切换按钮未按应有的方式对齐。我遵循了官方文档

如何像日历一样对齐时钟?

timepicker angular-material angular

2
推荐指数
2
解决办法
9232
查看次数