我使用ExecutorService
from Java来协调Threads.用于启动我使用的线程
pool = new ExecutorService(2);
callableResults = pool.invokeAll(threads);
Run Code Online (Sandbox Code Playgroud)
为了收集结果,我使用future.get()
每个线程."threads"是实现Callable
和覆盖的类中的对象列表call()
.
现在我遇到了以下问题.该方法call()
确实抛出了各种特定的异常.invokeAll()
并且future.get()
只投掷InterruptedException
.
我在哪里可以捕获我投入的具体例外情况call()
?或者我必须在那里处理它们?如果抛出其中一个异常,那么结果是InterruptedException
?
我最近看到了有关ECMAScript 5变化的演示文稿.这句话有一张幻灯片:
功能与可调用
Run Code Online (Sandbox Code Playgroud)typeof f === 'function' // ? f is Callable ({}).toString.call(f) === '[object Function]' // ? f is a Function
任何人都可以向我解释一下Function和Callable之间的区别是什么?
我有以下代码,使用Keras Scikit-Learn Wrapper,它工作正常:
from keras.models import Sequential
from keras.layers import Dense
from sklearn import datasets
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_val_score
import numpy as np
def create_model():
# create model
model = Sequential()
model.add(Dense(12, input_dim=4, init='uniform', activation='relu'))
model.add(Dense(6, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
def main():
"""
Description of main
"""
iris = datasets.load_iris()
X, y = iris.data, iris.target
NOF_ROW, NOF_COL = X.shape
# evaluate …
Run Code Online (Sandbox Code Playgroud) 我正在研究提升线程.我发现线程类有一个接受可调用对象的构造函数.什么是可调用对象?
class CallableClass
{
private:
// Number of iterations
int m_iterations;
public:
// Default constructor
CallableClass()
{
m_iterations=10;
}
// Constructor with number of iterations
CallableClass(int iterations)
{
m_iterations=iterations;
}
// Copy constructor
CallableClass(const CallableClass& source)
{
m_iterations=source.m_iterations;
}
// Destructor
~CallableClass()
{
}
// Assignment operator
CallableClass& operator = (const CallableClass& source)
{
m_iterations=source.m_iterations;
return *this;
}
// Static function called by thread
static void StaticFunction()
{
for (int i=0; i < 10; i++) // Hard-coded upper limit
{ …
Run Code Online (Sandbox Code Playgroud) 我试图了解Java FixedThreadPool在实践中如何工作,但文档没有回答我的问题.
假设一个简单的场景,如:
ExecutorService ES= Executors.newFixedThreadPool(3);
List<Future> FL;
for(int i=1;i<=200;i++){
FL.add(ES.submit(new Task()));
}
ES.shutdown();
Run Code Online (Sandbox Code Playgroud)
这里Task
是Callable
它构建一些资源,使用它们,然后返回一些输出.
我的问题:Task
完成for
循环后有多少内存?换句话说:Task
一次只有3 个构建资源,或者所有资源都是预先创建的,这样,在.submit
我有200个Task
(及其资源)等待执行之后?
注意:资源构造发生在构造函数中Task
,而不是在call()
方法中.
在javadoc中(随意跳过以下内容):让我感到困惑的是Java文档中的以下解释
创建一个线程池,该线程池重用在共享的无界队列中运行的固定数量的线程.在任何时候,最多nThreads线程将是活动的处理任务.
我想这意味着,在我的示例中,所有200个任务都在队列中,但其中只有3个随时执行.
任何帮助都非常感谢.
标准Runnable
接口只有非参数化run()
方法.还有通用类型返回结果的方法Callable<V>
接口call()
.我需要传递泛型参数,如下所示:
interface MyRunnable<E> {
public abstract void run(E reference);
}
Run Code Online (Sandbox Code Playgroud)
是否有任何标准接口用于此目的,或者我必须自己声明基本接口? class Foo(object):
def tick(self):
print("something")
class Bar(object):
def __init__(self):
self.foo = Foo()
def tick(self):
#Here's what I do....
self.foo.tick()
#here's what my goal would be
self.foo()
b = Bar()
b.tick()
Run Code Online (Sandbox Code Playgroud)
这基本上是我的目标.从我收集到的内容中我可以将tick功能更改为__call__
,这样我就可以按照自己的意愿行事.其他几个答案说这会产生一个对象的新实例,这是否意味着它会使用self.foo的内存?或者它会成为一个全新的对象,新实例?或制作self.foo的副本?
此外还有一些缺点,可能会或可能不会表现出来.对于我的程序的特定部分,我检查对象是否有一个__call__
来确定我传递的参数是函数还是变量,我真的不认为我想要允许它被调用(尽管如此,我认为该类在技术上将是一个函数.)有没有办法区分函数和可调用类?
还有什么能使这种做法变得不受欢迎(这是一种pythonic的工作方式吗?)?我的下一个想法是,鉴于其他变量前缀为__
cant,在类之外使用,但这似乎不是这里的情况.
假设我想foo
异步运行静态方法
void foo() throws Exception {...}
Run Code Online (Sandbox Code Playgroud)
由于foo
抛出一个异常,我宁愿创建Callable
并调用ExecutorService.submit
它来获得Future
.
现在我不知道如何申报的Callable
和Future
正确的.我应该申报吗?
Callable<Void> and Future<Void>?
Run Code Online (Sandbox Code Playgroud) 当我必须编写对可调用函数的引用时,我使用PHP的标准语法定义为:
PHP函数的名称作为字符串传递.可以使用任何内置或用户定义的函数[...省略...].
实例化对象的方法作为包含索引0处的对象和 索引1处的方法名称 (aka字符串)的数组传递.
通过传递类名 (仍然是字符串) 而不是索引0处的对象,也可以传递静态类方法而无需实例化该类的对象.
从PHP 5.2.3开始,也可以传递 (字符串) 'ClassName :: methodName'.
除了常见的用户定义函数,匿名函数也可以传递给回调参数.
对于诸如函数名重构或查找用法之类的操作,所有这些方式都不是"IDE友好的" .
在我的回答中,我提出了一个解决方案,但是还有其他方法可以应用,甚至是完全不同的,允许IDE"找到"方法的调用?
我有一个正在使用的客户库和传入DataRequest
对象拥有userid
,timeout
并且在它的一些其他领域.现在我使用这个DataRequest
对象创建一个URL,然后我使用了一个HTTP调用RestTemplate
,我的服务返回一个JSON响应,我用它来创建一个DataResponse
对象并将这个DataResponse
对象返回给它们.
以下是DataClient
客户通过将DataRequest
对象传递给我的类.DataRequest
如果在getSyncData
方法中花费太多时间,我正在使用客户传递的超时值来超时请求.
public class DataClient implements Client {
private RestTemplate restTemplate = new RestTemplate();
// first executor
private ExecutorService service = Executors.newFixedThreadPool(15);
@Override
public DataResponse getSyncData(DataRequest key) {
DataResponse response = null;
Future<DataResponse> responseFuture = null;
try {
responseFuture = getAsyncData(key);
response = responseFuture.get(key.getTimeout(), key.getTimeoutUnit());
} catch (TimeoutException ex) {
response = new DataResponse(DataErrorEnum.CLIENT_TIMEOUT, DataStatusEnum.ERROR);
responseFuture.cancel(true);
// logging …
Run Code Online (Sandbox Code Playgroud)