python 多进程使用

 不常用的小小号 发布于 2022-10-25 09:35

假设:有个数据操作,处理100万条数据,每个数据的value+1。
如简单代码假设

for x in range(1,100):
    x++

从数据库获取100条了,然后想多进程去执行x++?
还是说多进程去数据库获取数据?
谢谢了

6 个回答
  • 你可以直接把数据读取和数据+1两个函数再写到一个操作中啊,然后用多进程去操作,就上楼上说的一样用进程池进行操作。根据你的cpu核数,设置进程池的大小。由于多进程间不进行内存共享、也不能直接通信,你先用多进程从数据库中把所有数据读出来,然后再用多进程进行val+1也行的

    2022-10-26 23:00 回答
  • 其实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))
    2022-10-26 23:00 回答
  • 先将原始数据存入队列(queue)中,作为生产者
    后从队列中取数据,执行操作,作为消费者
    这时,可以在消费者开多线程(当然你锁处理得好的话,生产者也可以做多线程)

    while tmp_queue.empty() is not True:
        x = tmp_queue.get()
        x += 1

    在队列中,如果一直存在元素线程会持续进行操作。

    2022-10-26 23:00 回答
  • 有一个问题: 如果是数据库里面的数据, 为什么不执行sql,这比什么多进程要高效的多吧?
    如果非要你给出的二选一, 那么考虑一下:

    1). 如果你要用多进程去数据库获取数据(就算你用了mysql连接池,可以不怎么考虑数据库连接的io消耗),
    你每取一次数据,总要有一次查询吧, 完了以后,你还要把更新后的数据写入到数据库了, 又是一次数据库操作,
    想想这个消耗有多大?
    2). 数据库获取100万数据,然后想多进程去执行x++; 这种情况啊,只要计算机内存够(只有100万数据,基本是没问题的), 用python的进程池map一下,确实也是没什么问题
    2022-10-26 23:01 回答
  • 在JEE项目中实施SSL双向认证

    2022-10-26 23:01 回答
  • 自己搜索了下证书传递,貌似找到这么一篇,还没经过验证,可能可以解决这个问题

    1. 证书层级结构

    1. 服务器结构

    tomcat不要求认证客户端,nginx要求认证客户端

    1. tomcat配置注意点

    tomcat的服务器证书的CN必须为tomcat_backend

    1. 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双向认证》

    2022-10-26 23:01 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有