多进程,多线程

多进程

"""
Pool 可以提供指定数量的进程供用户调用,默认大小是 CPU 的核数。但有新的请求提交到
Pool 中时,池还没有满,就会创建一个新的进程用来执行该请求;如已达到最大数,就会等待
知道有进程结束,才会创建新的进程来处理他
"""
from multiprocessing import Pool
import os,time,random


def run_task(name):
    print('Task %s (pid = %s) is running ...' % (name,os.getpid()))
    time.sleep(random.random() * 3)
    print('Task %s end.' % name)


if __name__ == '__main__':
    print('Current process %s.' % os.getpid()) # os.getpid() 获得进程 id
    p = Pool(processes=3)
    for i in range(5):
        p.apply_async(run_task,args=(i,)) #添加进程任务,i 为传进去的进程任务的参数
        pass
    print('Waiting for all subprocesses done...')
    p.close() #不再添加新进程
    p.join() #等待所有子进程执行完毕,调用之前必须先调用 close(),针对 Pool 对象
    print('All subprocesses done.')

 

多进程+进度条

"""
Pool 可以提供指定数量的进程供用户调用,默认大小是 CPU 的核数。但有新的请求提交到
Pool 中时,池还没有满,就会创建一个新的进程用来执行该请求;如已达到最大数,就会等待
知道有进程结束,才会创建新的进程来处理他
"""
from multiprocessing import Pool
import os, time, random, tqdm


def run_task(name):
    #print('Task %s (pid = %s) is running ...' % (name, os.getpid()))
    time.sleep(random.random() * 3)
    #print('Task %s end.' % name)


if __name__ == '__main__':
    # 配置好进度条
    pbar = tqdm.tqdm(total=5)
    pbar.set_description(' Task Has Completed ')
    update = lambda *args: pbar.update()

    print('Current process %s.' % os.getpid())  # os.getpid() 获得进程 id
    p = Pool()
    for i in range(5):
        p.apply_async(run_task, args=(5,), callback=update) # 通过callback来更新进度条
        p.apply_async(run_task, args=(i,))  # 添加进程任务,i 为传进去的进程任务的参数
    print('Waiting for all subprocesses done...')
    p.close()  # 不再添加新进程
    p.join()  # 等待所有子进程执行完毕,调用之前必须先调用 close(),针对 Pool 对象
    print('All subprocesses done.')

 

多进程不执行

1.多进程执行的函数中如果用到了全局变量,变量不能定义在 if __name__ == '__main__' 下面

2.多进程代码必须在 f __name__ == '__main__' 下面

3.爬取数据会遇到一种情况,数据随时在更新,使用多进程服务器返回 500,不使用多进程就正常,可以选择截止到昨天的数据爬取,不包含今天的,问题就解决了。

 

 

多线程

"""
把一个函数传入并创建 Tread 实例
"""
import random
import time,threading


#新线程执行的代码
def thread_run(urls):
    print('Current %s is running...' % threading.current_thread().name) 
    for url in urls:
        print('%s --->>> %s' % (threading.current_thread().name,url))
        time.sleep(random.random())
    print('%s ended.' % threading.current_thread().name)


print('%s is runnung...' % threading.current_thread().name)
t1 = threading.Thread(target=thread_run,name='Thread_1',args=(['url_1',
                            'url_2','url_3'],))
t2 = threading.Thread(target=thread_run,name='Thread_2',args=(['url_4',
                            'url_5','url_6'],))
t1.start()
t2.start()
t1.join()
t2.join()
print('%s ended.' % threading.current_thread().name)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值