Twitter Util

来自 Twitter 的精彩可重用代码。「Wonderful reusable code from Twitter」

  • 所有者: twitter/util
  • 平台:
  • 許可證: Apache License 2.0
  • 分類:
  • 主題:
  • 喜歡:
    0
      比較:

Github星跟蹤圖

Twitter Util

Build Status
Project status
Gitter
Maven Central

A bunch of idiomatic, small, general purpose tools.

See the Scaladoc here
or check out the user guide.

Status

This project is used in production at Twitter (and many other organizations),
and is being actively developed and maintained.

Releases

Releases
are done on an approximately monthly schedule. While semver
is not followed, the changelogs are detailed and include sections on
public API breaks and changes in runtime behavior.

Contributing

We feel that a welcoming community is important and we ask that you follow Twitter's
Open Source Code of Conduct
in all interactions with the community.

The release branch of this repository contains the latest stable release of
Util, and weekly snapshots are published to the develop branch. In general
pull requests should be submitted against develop. See
CONTRIBUTING.md
for more details about how to contribute.

Using in your project

An example SBT dependency string for the util-core library would look like this:

val utilCore = "com.twitter" %% "util-core" % "23.11.0"

Units

Time

import com.twitter.conversions.DurationOps._

val duration1 = 1.second
val duration2 = 2.minutes
duration1.inMillis // => 1000L

Space

import com.twitter.conversions.StorageUnitOps._
val amount = 8.megabytes
amount.inBytes // => 8388608L
amount.inKilobytes // => 8192L

Futures

A Non-actor re-implementation of Scala Futures.

import com.twitter.conversions.DurationOps._
import com.twitter.util.{Await, Future, Promise}

val f = new Promise[Int]
val g = f.map { result => result + 1 }
f.setValue(1)
Await.result(g, 1.second) // => this blocks for the futures result (and eventually returns 2)

// Another option:
g.onSuccess { result =>
  println(result) // => prints "2"
}

// Using for expressions:
val xFuture = Future(1)
val yFuture = Future(2)

for {
  x <- xFuture
  y <- yFuture
} {
  println(x + y) // => prints "3"
}

Future interrupts

Method raise on Future (def raise(cause: Throwable)) raises the interrupt described by
cause to the producer of this Future. Interrupt handlers are installed on a Promise
using setInterruptHandler, which takes a partial function:

val p = new Promise[T]
p.setInterruptHandler {
  case exc: MyException =>
    // deal with interrupt..
}

Interrupts differ in semantics from cancellation in important ways: there can only be one
interrupt handler per promise, and interrupts are only delivered if the promise is not yet
complete.

Object Pool

The pool order is FIFO.

A pool of constants

import scala.collection.mutable
import com.twitter.util.{Await, SimplePool}

val queue = new mutable.Queue[Int] ++ List(1, 2, 3)
val pool = new SimplePool(queue)

// Note that the pool returns Futures, it doesn't block on exhaustion.
assert(Await.result(pool.reserve()) == 1)
pool.reserve().onSuccess { item =>
  println(item) // prints "2"
}

A pool of dynamically created objects

Here is a pool of even-number generators. It stores 4 numbers at a time:

import com.twitter.util.{Future, FactoryPool}

val pool = new FactoryPool[Int](4) {
  var count = 0
  def makeItem() = { count += 1; Future(count) }
  def isHealthy(i: Int) = i % 2 == 0
}

It checks the health when you successfully reserve an object (i.e., when the Future yields).

Hashing

util-hashing is a collection of hash functions and hashing distributors (eg. ketama).

To use one of the available hash functions:

import com.twitter.hashing.KeyHasher

KeyHasher.FNV1_32.hashKey("string".getBytes)

Available hash functions are:

FNV1_32
FNV1A_32
FNV1_64
FNV1A_64
KETAMA
CRC32_ITU
HSIEH

To use KetamaDistributor:

import com.twitter.hashing.{KetamaDistributor, KetamaNode, KeyHasher}

val nodes = List(KetamaNode("host:port", 1 /* weight */, "foo" /* handle */))
val distributor = new KetamaDistributor(nodes, 1 /* num reps */)
distributor.nodeForHash("abc".##) // => client

Time and Duration

Like arithmetic on doubles, Time and Duration arithmetic is now free of overflows. Instead, they overflow to Top and Bottom values, which are analogous to positive and negative infinity.

Since the resolution of Time.now has been reduced (and is also more expensive due to its use of system time), a new Stopwatch API has been introduced in order to calculate durations of time.

It's used simply:

import com.twitter.util.{Duration, Stopwatch}
val elapsed: () => Duration = Stopwatch.start()

which is read by applying elapsed:

val duration: Duration = elapsed()

License

Copyright 2010 Twitter, Inc.

Licensed under the Apache License, Version 2.0: https://www.apache.org/licenses/LICENSE-2.0

主要指標

概覽
名稱與所有者twitter/util
主編程語言Scala
編程語言Makefile (語言數: 7)
平台
許可證Apache License 2.0
所有者活动
創建於2011-03-26 01:23:21
推送於2025-04-21 03:10:33
最后一次提交
發布數99
最新版本名稱util-24.5.0 (發布於 )
第一版名稱version-1.3.0 (發布於 2010-12-17 12:30:30)
用户参与
星數2.7k
關注者數224
派生數582
提交數3.1k
已啟用問題?
問題數116
打開的問題數5
拉請求數9
打開的拉請求數9
關閉的拉請求數179
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?