python多线程编程,获取各个线程返回值及相关问题

news/2024/7/19 8:39:47 标签: python, 开发语言, 爬虫

1. multiprocessing.Process() 

针对使用multiprocessing.Process() 的多线程机制

获取返回值的方法:multiprocessing.Manager(),构造线程返回结果存储结构,本质是共享内存

具体方法样例:

python">import os
import sys
import random
import threading
import multiprocessing
 
# 线程执行函数
def worker(procnum, return_dict):
    """worker function"""
    print(str(procnum) + " represent!")
    num = random.randint(5,20)
    arr = []
    for i in range(num):
        arr.append(i)
    # 依据线程id来存储各线程对应的处理结果
    return_dict[procnum] = (procnum,arr)
 
if __name__ == "__main__":
    manager = multiprocessing.Manager()
    # 构造返回值存储结构,本质是共享内存方式
    return_dict = manager.dict()
    jobs = []
    for i in range(5):
        # 将构造的返回值存储结构传递给多线程执行函数,并标识各个线程id
        p = multiprocessing.Process(target=worker, args=(i, return_dict))
        jobs.append(p)
        p.start()
 
    for proc in jobs:
        proc.join()
    
    # 所有线程处理完毕后,遍历结果输出
    for id,arr in return_dict.values():
        print(id,arr)

但是,当返回数据非常大的时候,当线程执行完毕,存储结果时会报错,实验平台(vscode,centos 7).目前还没找到解决方法。

python">Traceback (most recent call last):
  File "/usr/local/lib/python3.7/multiprocessing/managers.py", line 788, in _callmethod
    conn = self._tls.connection
AttributeError: 'ForkAwareLocal' object has no attribute 'connection'
 
During handling of the above exception, another exception occurred:
 
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/usr/local/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "excute_fanci2.py", line 357, in product
    # return_dict[thread_id] = ( domains,has_word)
  File "<string>", line 2, in __setitem__
  File "/usr/local/lib/python3.7/multiprocessing/managers.py", line 792, in _callmethod
    self._connect()
  File "/usr/local/lib/python3.7/multiprocessing/managers.py", line 779, in _connect
    conn = self._Client(self._token.address, authkey=self._authkey)
  File "/usr/local/lib/python3.7/multiprocessing/connection.py", line 492, in Client
    c = SocketClient(address)
  File "/usr/local/lib/python3.7/multiprocessing/connection.py", line 619, in SocketClient
    s.connect(address)
FileNotFoundError: [Errno 2] No such file or directory

2. multiprocessing.Pool()

使用另外一种方法 multiprocessing.Pool() ,可以解决返回数据过大问题,目前实验没有出现问题:

python">import os
import sys
import random
import threading
import multiprocessing
import time
 
 
 
def worker(args):
    ## 该方法在传递多个参数时,似乎只能通过这样进行传递,否则会报错
    threadname, res_path, thread_id = args[0], args[1], args[2]
    
    result = [i for i in range(10000000)]
    
    return (result, thread_id)
 
 
if __name__ == "__main__":
    process_num = 20
    ## 仍然是线程池方法
    pool = multiprocessing.Pool(processes = process_num)
    args_list = []
    ## 下面构造各个线程的参数列表,如果每个线程接受多个参数,注意在多参数接收方式
    for i in range(process_num):
        threadname  = "thread"+str(i)
        res_path = str(i)+'_'
        args=(threadname,res_path,i)
        args_list.append(args)
    
    ## 将参数传递给线程池,绑定执行方法,map方法返回的是一个结果列表,包含各个线程的执行结果
    results = pool.map(worker,args_list)
 
    for result,id in results:
        print(results)

原文:python多线程编程,获取各个线程返回值 及 相关问题_AdvSoul的博客-CSDN博客


http://www.niftyadmin.cn/n/957301.html

相关文章

goovis如何连接电脑_打印机怎么连接电脑 电脑如何连接打印机 电脑连接打印机的步骤...

现在在办公室打印文件都离不开打印机。使用打印机的时候&#xff0c;要将打印机的硬件连接到电脑上或者连接到网络上&#xff0c;在打印文件的时候&#xff0c;还需要有打印机的驱动程序&#xff0c;这样才能连接到打印机。电脑如何连接打印机呢&#xff1f;下面就具体介绍电脑…

python logging 把日志信息输出至文件

import logging# 创建logger对象 logger logging.getLogger(test_logger)# 设置日志等级 logger.setLevel(logging.DEBUG)# 追加写入文件a &#xff0c;设置utf-8编码防止中文写入乱码 test_log logging.FileHandler(test.log,a,encodingutf-8)# 向文件输出的日志级别 test_l…

Python 的 @dataclass

dataclass是一个装饰器&#xff0c;用于自动生成一些special method并添加到类中 dataclasses.dataclass(*, initTrue, reprTrue, eqTrue, orderFalse, unsafe_hashFalse, frozenFalse, match_argsTrue, kw_onlyFalse, slotsFalse) 例子 dataclass class C:a: int # a…

Anaconda错误CondaHTTPError: HTTP None None for url

改镜像源 https -->http vim ~/.condarc channels:- defaults show_channel_urls: true default_channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free- http://mirrors.tuna.tsinghua.edu.cn/an…

超详细Windows10/Windows11 子系统(WSL2)安装Ubuntu20.04(带桌面环境)+CUDA11.3+pytorch1.8.1+pycharm

超详细Windows10/Windows11 子系统&#xff08;WSL2&#xff09;安装Ubuntu20.04&#xff08;带桌面环境&#xff09;_user-zhaowei的博客-CSDN博客_wsl 桌面环境目录前言在Windows上安装Linux子系统前提条件安装步骤在子系统Ubuntu20.04上安装桌面环境从Windows启动桌面版Ubun…

指定api路径_苹果cmsv10如何开放api采集接口供他人采集?

操作步骤&#xff1a;苹果cms管理后台&#xff1a;系统>>开放API配置>>①接口开关&#xff1a;开启②是否收费&#xff1a;根据自己需求设置③列表每页显示数量&#xff1a;建议默认20④图片域名&#xff1a;显示图片的完整访问路径所需要&#xff0c;以http:开头,…

【Pytorch进阶】pytorch中loss.backward() retain_graph=True参数意义

1 定义loss backward optimizer.zero_grad() loss.backward() optimizer.step()在定义loss时上面的代码是标准的三部曲&#xff0c;但是有时会碰到loss.backward(retain_graphTrue)这样的用法。 这个用法的目的主要是保存上一次计算的梯度不被释放。具体的计算图细节问题可以见…

这个添加不知道怎么写,似乎用组件最好,但是这里没有说到用组件,是不是还要用模板来解决?

<!DOCTYPE html><body> <div id"app"> <span>ID: <input type"text"> 书名: <input type"text"><button v-model"addBooks">添加</button></span><li v-for"(book, in…