我知道Scala Future更好的原因很多.是否有任何理由使用Twitter Future?除了Finagle使用它之外.
我试图从语法上解释以字符串形式给出的代码。例如:
val myString = "def f(x:Int):Int=x+1".
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种可以从中返回实函数的方法:例如:
val myIncrementFunction = myDarkMagicFunctionThatWillBuildMyFunction(myString)
println(myIncrementFunction(3))
Run Code Online (Sandbox Code Playgroud)
将打印4
用例:我想稍后在代码中使用该解释代码中的一些简单功能。例如,他们可以提供像def fun(x:Int):Int = x + 1这样的字符串,然后使用解释器来编译/执行该代码,然后我就可以使用此fun(x ),例如在地图中。
问题在于该函数类型对我来说是未知的,这是一个大问题,因为我需要从IMain撤消。我读过有关反射,类型系统等的信息,经过一番谷歌搜索后,我到达了这一点。我也检查了twitter的util-eval,但是从他们的测试中的文档和示例中看不到太多,这是完全一样的。
如果我知道类型,我可以做类似的事情
val settings = new Settings
val imain = new IMain(settings)
val res = imain.interpret("def f(x:Int):Int=x+1; val ret=f _ ")
val myF = imain.valueOfTerm("ret").get.asInstanceOf[Function[Int,Int]]
println(myF(2))
Run Code Online (Sandbox Code Playgroud)
可以正常工作并打印3,但是我被上面提到的问题所困扰,我不知道该函数的类型,而此示例的工作仅是因为我强制转换为在定义用于测试IMain的字符串函数时使用的类型作品。
您知道任何方法可以实现此功能吗?
我是新手,所以如果我写错了,请原谅。
谢谢
reflection functional-programming scala type-inference twitter-util
来自node.js背景,我是Scala的新手,我尝试使用Twitter的Future.collect来执行一些简单的并发操作.但我的代码显示顺序行为而不是并发行为.我究竟做错了什么?
这是我的代码,
import com.twitter.util.Future
def waitForSeconds(seconds: Int, container:String): Future[String] = Future[String] {
Thread.sleep(seconds*1000)
println(container + ": done waiting for " + seconds + " seconds")
container + " :done waiting for " + seconds + " seconds"
}
def mainFunction:String = {
val allTasks = Future.collect(Seq(waitForSeconds(1, "All"), waitForSeconds(3, "All"), waitForSeconds(2, "All")))
val singleTask = waitForSeconds(1, "Single")
allTasks onSuccess { res =>
println("All tasks succeeded with result " + res)
}
singleTask onSuccess { res =>
println("Single task succeeded with result …Run Code Online (Sandbox Code Playgroud) 像下面这样实现的 future 是否会获得一个新线程?显然不是(参见下面的输出)。为什么?如果我希望我的代码在新线程上运行,我该怎么办?
package MyTest
import com.twitter.util._
import scala.language.postfixOps
object Test {
def test1 = Future {
println("BeforeTest", Thread.currentThread())
Thread.sleep(5000)
println("AfterTest", Thread.currentThread())
}
def test2 = test1 onSuccess { case _ => println("Future on success") }
def main(args: Array[String]): Unit = {
println("main", Thread.currentThread())
test2
println("main123", Thread.currentThread())
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
(主,线程[运行主-0,5,运行主组-0])
(BeforeTest,线程[run-main-0,5,run-main-group-0])
(AfterTest,线程[run-main-0,5,run-main-group-0])
未来成功
(main123,线程[run-main-0,5,run-main-group-0])
我使用的是最新的Spark主,另外,我加载这些罐子: - 火花流-twitter_2.10-1.1.0-SNAPSHOT.jar - twitter4j核-4.0.2.jar - twitter4j流-4.0.2 .罐
我在shell中执行的简单测试程序如下所示:
import org.apache.spark.streaming._
import org.apache.spark.streaming.twitter._
import org.apache.spark.streaming.StreamingContext._
System.setProperty("twitter4j.oauth.consumerKey", "jXgXF...")
System.setProperty("twitter4j.oauth.consumerSecret", "mWPvQRl1....")
System.setProperty("twitter4j.oauth.accessToken", "26176....")
System.setProperty("twitter4j.oauth.accessTokenSecret", "J8Fcosm4...")
var ssc = new StreamingContext(sc, Seconds(1))
var tweets = TwitterUtils.createStream(ssc, None)
var statuses = tweets.map(_.getText)
statuses.print()
ssc.start()
Run Code Online (Sandbox Code Playgroud)
但是,我不会收到任何推文.我看到的主要错误是
14/08/04 10:52:35 ERROR scheduler.ReceiverTracker: Deregistered receiver for stream 0: Error starting receiver 0 - java.lang.NoSuchMethodError: twitter4j.TwitterStream.addListener(Ltwitter4j/StatusListener;)V
at org.apache.spark.streaming.twitter.TwitterReceiver.onStart(TwitterInputDStream.scala:72)
....
Run Code Online (Sandbox Code Playgroud)
然后为每次迭代:
INFO scheduler.ReceiverTracker: Stream 0 received 0 blocks
Run Code Online (Sandbox Code Playgroud)
我不确定问题出在哪里.如何验证我的Twitter凭据是否被正确识别?可能还有另一个罐子丢失了吗?