在下面的代码中,get()调用它并将结果分配给类型为的变量List<List<?>>.get()返回a List<List<T>>并在类型参数T设置为的实例上调用?,因此它应该适合.
import java.util.List;
class Test {
void foo(NestedListProducer<?> test) {
List<List<?>> a = test.get();
}
interface NestedListProducer<T> {
List<List<T>> get();
}
}
Run Code Online (Sandbox Code Playgroud)
但IntelliJ IDEA和Oracle的javac1.7.0_45版都拒绝我的代码无效.这是'javac'的错误消息:
java: incompatible types
required: java.util.List<java.util.List<?>>
found: java.util.List<java.util.List<capture#1 of ?>>
Run Code Online (Sandbox Code Playgroud)
为什么这段代码无效,即如果允许则会出错?
我工作的一个Maven的使用绑定到一个插件项目generate-sources和process-classes生命周期阶段.当项目导入IntelliJ IDEA时,IDEA会接管项目源的编译,并根据中的设置进行编译pom.xml.但它没有实现任何其他生命周期阶段.从IntelliJ IDEA中构建项目时,如何才能执行这些其他生命周期阶段?
我知道我可以创建一个运行配置,专门运行Maven与process-classes阶段,然后将此运行配置设置为在其他配置之前运行,但这将构建所有模块,而不仅仅是该特定运行配置所需的模块,除了它采取使用IntelliJ IDEA构建的时间长一个数量级.有没有更好的办法?
我正在使用Python脚本将UDP数据包发送到服务器,该服务器将注册我的脚本以接收来自服务器的通知.该协议要求我发送自己的IP地址和端口,我希望收到这些通知,因此这应该是可以从服务器网络访问的地址.
解决方案至少应该适用于Windows XP及更高版本,最好是Mac OS X,因为这是我的开发平台.
第一步是获取任何接口的IP地址.我目前正在使用通常建议的解析机器自己的主机名的方法:
def get_local_address():
return socket.gethostbyname(socket.gethostname())
Run Code Online (Sandbox Code Playgroud)
这有时只能起作用.目前它返回172.16.249.1,这是VM Ware使用的虚拟接口的地址,所以这是一个问题.
更好的方法是获取默认接口的IP地址,这在大多数时候应该是正确的.
更好的方法是通过面向连接的协议(如TCP)获取用于连接服务器的实际IP地址.我实际上可以获得该地址,但不是在没有尝试打开连接的情况下:
def get_address_to_connect_to(server_addr):
non_open_port = 50000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((server_addr, non_open_port))
except socket.error:
pass
else:
s.close() # just in case
return s.getsockname()[0]
Run Code Online (Sandbox Code Playgroud)
在服务器无法访问或其间的恶意防火墙阻止ICMP数据包的情况下,这将阻止直到达到某个TCP超时.有没有更好的方法来获取这些信息?
我正在寻找Windows 7支持的Windows资源工具包的一个版本.但是我很难找到下载位置或从哪里获取该软件的任何信息(例如OS或IDE的安装CD).
在Google上搜索"Windows 7资源工具包"时,我从Microsoft Press获得了很多本书的结果:
http://www.microsoft.com/learning/en/us/book.aspx?id=13811
我是否需要购买此书才能访问该软件,还是有其他方式?我只需要资源工具包中的一个可执行文件srvany.exe.我想知道,这个软件真的存在吗?
我们最近开始在@PreAuthorize我们的REST端点上使用注释.它工作得很好,但是,我确实对发出GET与POST或PUT时返回的HTTP代码有疑问.似乎当用户未被授权访问控制器的REST端点时,返回的HTTP状态对于GET和PUT/POST是不同的.
因此,例如,如果我的端点是GET并且具有@PreAuthorize注释并且用户没有访问权限,则返回403 Forbidden.这就是我的期望.
如果然后将相同的注释放在POST或PUT的控制器方法上,则HTTP响应为405 Method Not Allowed(请注意,如果正确授权,POST/PUT方法将按预期返回200).
单步执行代码时,您可以看到底层安全过滤器返回403,但在POST/PUT场景中,状态代码被删除/忽略并替换为405,就像NullPointerExcpetion在控制器代码中出现时一样.
这是预期的行为还是应该为无法访问终点的用户返回403 Forbidden?
的文档的Python 3.2的weakref模块WeakKeyDictionary,并WeakValueDictionary有一张纸条上遍历这些容器:
注意:注意:因为WeakKeyDictionary是在Python字典之上构建的,所以在迭代它时不能改变大小.这对于WeakKeyDictionary来说可能很难确保,因为程序在迭代期间执行的操作可能会导致字典中的项目"通过魔法"消失(作为垃圾收集的副作用).
作为这些容器行为的规范,这似乎相当可怕.特别是当运行使用CPython的垃圾收集器的代码(当使用包含循环的数据结构时)或使用另一个Python实现(例如Jython)时,听起来似乎没有安全的方法来迭代这些集合.
当垃圾收集器可以在程序中的任何位置清除引用时,如何安全地迭代这些集合?有一个CPython的解决方案是我的首要任务,但我也对其他实现的问题感兴趣.
这可能是一种迭代WeakKeyDictionary的安全方法吗?
import weakref
d = weakref.WeakKeyDictionary()
...
for k, v in list(d.items()):
...
Run Code Online (Sandbox Code Playgroud) Akka docs表示默认调度程序是一个fork-join-executor因为它"在大多数情况下都能提供出色的性能".
我想知道为什么会这样?
ForkJoinPool与其他类型的ExecutorService的不同之处主要在于使用工作窃取:池中的所有线程都尝试查找和执行提交给池的任务和/或由其他活动任务创建的任务(如果不存在则最终阻止等待工作) .这使得(1)在大多数任务产生其他子任务(如大多数ForkJoinTasks)时有效处理,以及(2)当许多小任务从外部客户端提交到池时.特别是在构造函数中将asyncMode设置为true时,ForkJoinPools也可以(3)适用于从未加入的事件样式任务.
起初,我猜Akka不是案例(1)的一个例子,因为我无法弄清楚Akka如何分配任务,我的意思是,在许多任务中可以分叉的任务是什么?
我认为每条消息都是一个独立的任务,这就是为什么我认为Akka与case(2)类似,其中消息是许多小任务(通过!和?)提交给ForkJoinPool.
下一个问题虽然与akka没有严格关系,但是,为什么ForkJoinPool fork_joinPool会使fork和join(允许工作窃取的主要功能)的用例仍然没有被使用?
从Fork Join Pool的可扩展性
我们注意到上下文切换的数量异常,超过每秒70000.
那一定是问题所在,但究竟是什么原因造成的呢?Viktor提出了合格的猜测,它必须是线程池执行器的任务队列,因为它是共享的,并且LinkedBlockingQueue中的锁可能会在存在争用时生成上下文切换.
但是,如果Akka不使用ForkJoinTasks,则外部客户端提交的所有任务都将在共享队列中排队,因此争用应与in中的相同ThreadPoolExecutor.
所以,我的问题是:
ForkJoinTasks(案例(1))还是与案例(2)有关?ForkJoinPool如果外部客户端提交的所有任务都被推送到共享队列并且不会发生工作窃取,为什么在情况(2)中是有益的?正确答案来自johanandren,但我想补充一些亮点.
现在,在(IIRC)JDK 7u12之前,ForkJoinPool有一个全局提交队列.当工作线程用尽本地任务以及窃取任务时,他们到达那里并试图查看外部工作是否可用.在这种设计中,对于由ArrayBlockingQueue支持的常规ThreadPoolExecutor没有任何优势.[...]
现在,外部提交进入其中一个提交队列.然后,没有工作的工作人员可以首先查看与特定工作者关联的提交队列,然后四处寻找其他人的提交队列.人们也可以称之为"偷工作".
因此,这可以在未使用fork join的情况下窃取工作.正如Doug Lea所说
当许多客户提交大量任务时,吞吐量大大提高.(我已经测量了高达60倍的speedupson微基准测试).我们的想法是以与工人类似的方式对待外部提交者 - 使用随机排队和转发.(这需要一个大的内部重构todisassociate工作队列和工作人员.)这也大大提高了所有任务异步并提交到池而不是分叉的吞吐量,这成为构建actor框架的合理途径,以及许多你可能使用的普通服务ThreadPoolExecutor for.
对于FJP来说,4%确实不多.你还需要注意FJP的权衡:FJP让线程旋转一段时间,以便能够更快地处理准时到达的工作.这确保了在许多情况下的良好延迟.特别是如果您的池过度配置,那么在几乎空闲的情况下,权衡时间与更多功耗有关.
我试图在SQLite3上输入1000行,但是插入时间太长了.我知道如果将插入组合成一个事务,速度会大大提高.但是,我似乎无法让SQlite3跳过检查文件是否写在硬盘上.
这是一个样本:
if repeat != 'y':
c.execute('INSERT INTO Hand (number, word) VALUES (null, ?)', [wordin[wordnum]])
print wordin[wordnum]
data.commit()
Run Code Online (Sandbox Code Playgroud)
这就是我在开始时所拥有的.
data = connect('databasenew')
data.isolation_level = None
c = data.cursor()
c.execute('begin')
Run Code Online (Sandbox Code Playgroud)
但是,它似乎没有什么区别.提高插入速度的方法将非常受欢迎.
在Java中,有java.util.concurrent.SynchronousQueue一个没有存储容量的队列.尝试放入/获取值的线程总是阻塞,直到另一个线程分别尝试获取/放置值.
有什么好的方法在Python中做同样的事情?即我想要一种方法将值从一个或多个线程的集合传递到另一个一个或多个线程的集合,而没有任何值"属于"任一组中的线程.
Python queue.Queue不允许长度0,为最大容量指定非正值会创建无限制队列.
一年一两次,我遇到以下问题:我有一些比较操作可能很昂贵的类型(例如,值太大而无法保存在内存中,需要从磁盘加载或相等性很难计算,因为单个值可能有多种表示,想想化学式)。这种类型是嵌套数据结构的一部分(例如嵌套列表或元组或某些树)。有时我注意到比较运算符 (__lt__我的类型上等)对于单个比较的相同值被多次调用。
我将尝试用以下示例来说明问题:
class X:
comparisons = 0
def __init__(self, value):
self.value = value
def __lt__(self, other):
return self.value < other.value
def __gt__(self, other):
return self.value > other.value
def __eq__(self, other):
X.comparisons += 1
return self.value == other.value
def nest_a_hundred_times(value):
for i in range(100): value = [value]
return value
print(nest_a_hundred_times(X(1)) < nest_a_hundred_times(X(0)))
print(X.comparisons)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,X是我的类型具有昂贵的比较操作,我只是计算次数__eq__()被调用但其他操作也可能很昂贵。该类型的两个不相等的值被创建并嵌套在单元素列表中多次。
运行示例打印False, 100。所以__eq__()被调用了100次。
我知道为什么发生这种情况:对于内置比较函数list对象平等单个列表元素首先比较,发现在该指数两个列表不同,比较订货那些元素之前。我认为当仅使用六个比较运算符(==, !=, <, <=, …
python ×5
java ×3
akka ×1
annotations ×1
comparison ×1
concurrency ×1
dictionary ×1
forkjoinpool ×1
generics ×1
insert ×1
ip ×1
maven ×1
rest ×1
service ×1
sqlite ×1
threadpool ×1
transactions ×1
windows ×1