假设:有个数据操作,处理100万条数据,每个数据的value+1。
如简单代码假设
for x in range(1,100): x++
从数据库获取100条了,然后想多进程去执行x++?
还是说多进程去数据库获取数据?
谢谢了
你可以直接把数据读取和数据+1两个函数再写到一个操作中啊,然后用多进程去操作,就上楼上说的一样用进程池进行操作。根据你的cpu核数,设置进程池的大小。由于多进程间不进行内存共享、也不能直接通信,你先用多进程从数据库中把所有数据读出来,然后再用多进程进行val+1也行的
其实Python中实现多进程的最佳方式是使用multiprocessing
中的map
例子(Python 3):
# f.py # 要对某个列表中每个元素都执行一次的function def f(x): return x + 1
# main.py from multiprocessing import pool from f import f # 创建进程池 p = pool.Pool(4) lst = range(100) # 使用多进程对整个列表进行计算 print(p.map(f, lst))
先将原始数据存入队列(queue)中,作为生产者
后从队列中取数据,执行操作,作为消费者
这时,可以在消费者开多线程(当然你锁处理得好的话,生产者也可以做多线程)
while tmp_queue.empty() is not True: x = tmp_queue.get() x += 1
在队列中,如果一直存在元素线程会持续进行操作。
有一个问题: 如果是数据库里面的数据, 为什么不执行sql,这比什么多进程要高效的多吧?
如果非要你给出的二选一, 那么考虑一下:
1). 如果你要用多进程去数据库获取数据(就算你用了mysql连接池,可以不怎么考虑数据库连接的io消耗), 你每取一次数据,总要有一次查询吧, 完了以后,你还要把更新后的数据写入到数据库了, 又是一次数据库操作, 想想这个消耗有多大? 2). 数据库获取100万数据,然后想多进程去执行x++; 这种情况啊,只要计算机内存够(只有100万数据,基本是没问题的), 用python的进程池map一下,确实也是没什么问题
在JEE项目中实施SSL双向认证
自己搜索了下证书传递,貌似找到这么一篇,还没经过验证,可能可以解决这个问题
证书层级结构
服务器结构
tomcat不要求认证客户端,nginx要求认证客户端
tomcat配置注意点
tomcat的服务器证书的CN必须为tomcat_backend
nginx配置注意点
使用openssl从pfx文件中导出pem格式公钥
openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem
使用openssl从pfx文件中导出pem格式私钥
openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem
使用openssl生成CA证书链
将根CA和中级CA的公钥证书导出,如导出后文件名分别为root.pem ca.pem
将root.pem ca.pem合并成一个文件,ca.pem在前,root.pem在后
cat ca.pem >> chain.pem
cat root.pem >> chain.pem
nginx server段配置
server { listen 443; server_name localhost; ssl on; ssl_certificate nginx服务器证书公钥; ssl_certificate_key nginx服务器证书私钥; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2; # 如果使用默认值,在谷歌浏览器中会提示使用的加密套件过时 ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH ; # 如果使用默认值,在谷歌浏览器中会提示使用的加密套件过时 ssl_prefer_server_ciphers on; ssl_verify_client on; # 开启客户端验证 ssl_verify_depth 2; # 这里一定要注意,服务器证书上面有几级CA就写几 ssl_client_certificate chain.pem; # 证书链 用于验证客户端提供的证书 ssl_trusted_certificate 证书链; location / { proxy_pass https://tomcat_backend; include proxy.conf; } }
将客户端证书通过http头传递给后端的tomcat。在proxy.conf文件中配置
proxy_redirect off; proxy_set_header Host $host; proxy_set_header Client-Cert $ssl_client_cert; # 将客户端证书放到http头中传递给后端的tomcat proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 30; proxy_send_timeout 15; proxy_read_timeout 15; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_ssl_certificate localhost.pem; # 如果后端的tomcat也要求客户端认证,则nginx与tomcat建立连接时会把该证书发送给tomcat proxy_ssl_certificate_key localhost.key; proxy_ssl_trusted_certificate chain.pem; # 如果启用了proxy_ssl_verify,则使用该文件中的CA公钥验证后端tomcat的证书 proxy_ssl_verify on; # nginx是否验证后端tomcat的证书 proxy_ssl_verify_depth 2;
关于如果生成CA证书、客户端证书、服务器证书,请参见 《在JEE项目中实施SSL双向认证》