Random在多个线程之间共享一个类的实例是否有效?nextInt(int)特别是从多个线程调用?
我无法理解为什么Java HttpURLConnection不遵循重定向.我使用以下代码来获取此页面:
import java.net.URL;
import java.net.HttpURLConnection;
import java.io.InputStream;
public class Tester {
public static void main(String argv[]) throws Exception{
InputStream is = null;
try {
String httpUrl = "http://httpstat.us/301";
URL resourceUrl = new URL(httpUrl);
HttpURLConnection conn = (HttpURLConnection)resourceUrl.openConnection();
conn.setConnectTimeout(15000);
conn.setReadTimeout(15000);
conn.connect();
is = conn.getInputStream();
System.out.println("Original URL: "+httpUrl);
System.out.println("Connected to: "+conn.getURL());
System.out.println("HTTP response code received: "+conn.getResponseCode());
System.out.println("HTTP response message received: "+conn.getResponseMessage());
} finally {
if (is != null) is.close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
而且,我收到以下回复(看起来绝对正确!):
Original URL: http://httpstat.us/301 Connected to: …
事实上,Linux上的-static gcc标志现在不起作用.让我引用GNU libc FAQ:
2.22.即使是静态链接的程序也需要一些我不能接受的共享库.我能做什么?
如果没有共享库,{AJ} NSS(详细信息只需输入`info libc"Name Service Switch"')将无法正常工作.NSS允许通过仅更改一个配置文件(/etc/nsswitch.conf)而不重新链接任何程序来使用不同的服务(例如NIS,文件,db,hesiod).唯一的缺点是现在静态库需要访问共享库.这由GNU C库透明地处理.
解决方案是使用--enable-static-nss配置glibc.在这种情况下,您可以创建一个仅使用服务dns和文件的静态二进制文件(为此更改/etc/nsswitch.conf).您需要明确链接所有这些服务.例如:
Run Code Online (Sandbox Code Playgroud)gcc -static test-netdb.c -o test-netdb \ -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group这种方法的问题在于您必须将使用NSS例程的每个静态程序与所有这些库链接起来.
{UD}事实上,不能再说使用此选项编译的libc正在使用NSS.没有开关了.因此,强烈 建议不要使用--enable-static-nss,因为这会使系统上程序的行为不一致.
关于这个事实,现在有什么合理的方法可以在Linux上创建一个功能齐全的静态构建,或者静态链接在Linux上完全没用?我的意思是静态构建:
首先,一些背景.有一个工作人员扩展/解决了一堆短URL:
http://t.co/example -> http://example.com
Run Code Online (Sandbox Code Playgroud)
所以,我们只是按照重定向.而已.我们不会从连接中读取任何数据.在我们得到200之后,我们返回最终的URL并关闭InputStream.
现在,问题本身.在生产服务器上,其中一个解析程序线程挂起在InputStream.close()调用内:
"ProcessShortUrlTask" prio=10 tid=0x00007f8810119000 nid=0x402b runnable [0x00007f882b044000]
java.lang.Thread.State: RUNNABLE
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.skip(BufferedInputStream.java:352)
- locked <0x0000000561293aa0> (a java.io.BufferedInputStream)
at sun.net.www.MeteredStream.skip(MeteredStream.java:134)
- locked <0x0000000561293a70> (a sun.net.www.http.KeepAliveStream)
at sun.net.www.http.KeepAliveStream.close(KeepAliveStream.java:76)
at java.io.FilterInputStream.close(FilterInputStream.java:155)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.close(HttpURLConnection.java:2735)
at ru.twitter.times.http.URLProcessor.resolve(URLProcessor.java:131)
at ru.twitter.times.http.URLProcessor.resolve(URLProcessor.java:55)
at ...
Run Code Online (Sandbox Code Playgroud)
经过简单的研究,我明白skip()在将数据流发送回连接池之前会调用它来清理流(如果设置了keep-alive?).我仍然不明白如何避免这种情况.此外,我怀疑代码中是否存在一些不良设计或JDK中存在问题.
所以,问题是:
close()?例如,保证一些合理的超时.skip()被召唤......更新:
KeepAliveStream,第79行,close()方法:
// Skip past the data that's left in the Inputstream because
// some sort of error may have occurred. …Run Code Online (Sandbox Code Playgroud) 以下代码是否安全:
try {
URL url = new URL(urlRequest);
conn = (HttpURLConnection)url.openConnection();
conn.setConnectTimeout(30000);
conn.setReadTimeout(30000);
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
String encoding = conn.getContentEncoding();
return Utils.wrapCompressedStream(conn.getInputStream(), encoding);
} catch (IOException e) {
if(conn != null) {
conn.getContentEncoding();
conn.getErrorStream();
conn.whateverOtherMethodThere();
...
}
}
Run Code Online (Sandbox Code Playgroud)
特别是,在InterruptedIOException(例如,读取超时)的情况下调用类似的方法getContentEncoding()是否安全?据我所知,这种方法需要实时连接来读取HTTP(S)头.
更新(附加信息):
这个问题源于真实的系统体验.我相信,系统是在Oracle/Sun JVM 1.6上运行的.代码几乎相同:
...
} catch (IOException e) {
if(conn != null) {
try {
String response = tryGetResponse(conn);
...
Run Code Online (Sandbox Code Playgroud)
在这个问题发生tryGetResponse在HTTPS请求:
private static String tryGetResponse(HttpURLConnection conn) {
if(conn == null) return "(failed to get)"; …Run Code Online (Sandbox Code Playgroud) 众所周知,glibc(以及据我所知,glibstd ++)也使用符号版本控制机制.(有关详细信息,请参阅: 如何链接到特定的glibc版本.)
问题是如何确定GLIBC和GLIBCXX的确切版本将由链接器为libc和libstdc ++中的名称选择?例如,如何得到这样的东西:
time -> time@GLIBC_2_5
...
gethostbyname -> gethostbyname@GLIBC_2_3
Run Code Online (Sandbox Code Playgroud)
我们为什么需要这个?在我看来,如果你想最小化所需的glibc/libstdc ++版本,它会很有用.
简单的测试应用:
from gevent import monkey
monkey.patch_all()
from pymongo import Connection, MongoClient
from flask import Flask, make_response
app = Flask(__name__)
print "connect"
connection = MongoClient("host1, host2, host3", 27017, max_pool_size=4, **{"connectTimeoutMS": 3000, "socketTimeoutMS": 3000, "use_greenlets": True})
print "db"
db = connection.barn_2
@app.route('/')
def hello_world():
return make_response("Hello world!", 200, {'Content-type': 'application/json; charset=UTF-8'})
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
如果它作为一个独立的应用程序运行,它可以完美运行:
shcheklein@hostname:~$ python test.py
connect
db
* Running on http://127.0.0.1:5000/
127.0.0.1 - - [07/Apr/2014 13:07:31] "GET / HTTP/1.1" 200 -
^CKeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)
但没有从gunicorn开始:
shcheklein@hostname:~$ gunicorn -w 1 …Run Code Online (Sandbox Code Playgroud) 例如,如果我有两个文件:
文件1:
This is file 1
Run Code Online (Sandbox Code Playgroud)
和file2:
This is file 2
Run Code Online (Sandbox Code Playgroud)
并使用以下命令创建补丁:
diff -u file1 file2 > files.patch
Run Code Online (Sandbox Code Playgroud)
结果是:
--- file1 Fri Aug 13 17:53:28 2010
+++ file2 Fri Aug 13 17:53:38 2010
@@ -1,1 +1,1 @@
-This is file 1
+This is file 2
Run Code Online (Sandbox Code Playgroud)
然后,如果我尝试在Solaris上使用patch命令应用此补丁:
patch -u -i files.patch
Run Code Online (Sandbox Code Playgroud)
它挂在:
Looks like a unified context diff.
File to patch:
Run Code Online (Sandbox Code Playgroud)
1.有没有办法将Solaris 本机补丁命令与统一差异一起使用?
2.如果无法应用统一格式,哪种差异格式被认为是最便携的?
更新:
我在问题的第一部分找到了答案.patch如果第二个文件(在这种情况下为file2)与第一个文件(file1)存在于同一文件夹中,那么Solaris上似乎会挂起.例如,以下相当常见的差异:
--- a/src/file.src Sat Aug 14 23:07:29 2010
+++ b/src/file.src Sat Aug 14 …Run Code Online (Sandbox Code Playgroud) 在我们的架构中,即使与本地网络的连接丢失,JMS 发布者也可以继续工作(并生成新消息)。是否可以使用 JMS 使发布服务器容忍网络或代理中断:
据我所知,它可以在每台发布机器上使用嵌入式(本地)代理来完成。如果这是唯一的方法,那么该拓扑是否存在任何不明显的问题 - 性能、维护等?本地代理是否可以自行容忍中断?
要运行Sedna XML数据库,我需要增加它的大小/dev/shm.它现在是64M.
有一些简单的方法来做到这一点?
我们在应用程序中观察到Windows 7 x64上的4-6个线程,这些线程有3个线程,并且在Windows 7之前的任何Windows(32位或64位)上都能正常运行.
Process Explorer显示以下"未知"线程:
ntdll.dll!EtwDeliverDataBlock+offset
Run Code Online (Sandbox Code Playgroud)
在随机间隔之后出现以下线程:
ntdll.dll!TpCallbackIndependent+offset
ntdll.dll!TpCallbackIndependent+offset
Run Code Online (Sandbox Code Playgroud)
之后该应用程序无法创建线程(错误代码8,足够热的空间......).
在我看来,一些系统DLL创建ETW线程或其他东西.有谁知道这些线程是什么以及如何管理它们?
有没有一种方法可以强制'-m64'不覆盖CXXFLAGS / CFLAGS。我想要像在Linux / BSD amd64中一样的自动x64构建环境。
我为什么需要这个?
问题是项目的复杂性,我需要在Solaris上将其作为x64。它包含几个部分,每个部分都可以使用特定的C / C ++编译器标志。因此,我不能只运行:
CXXFLAGS=-m64 O2 ...
CFLAGS=-m64 -O2 ...
./configure
Run Code Online (Sandbox Code Playgroud)
因为没有通用的C / C ++标志。
我需要的是将'-m64'透明地附加到每个gcc / g ++调用中的方法。