#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''@auther :mr.qin
@IDE:pycharm''' from tool.Common import *
from tool.request_data_change_to_StrEncode import request_data_change_to_str
from tool.tencent_cloud_mysql_connect import Mysql_operation
import time
import requests
from multiprocessing import Process,Queue,Pool,Manager,Lock
import os my_op = Mysql_operation()
get_data = '''select order_id,order_sn from order_info limit 100;'''
data = my_op.sql_operation(get_data)
data_to_str = request_data_change_to_str()
lock=Lock() def testDoWeChatNotify(q):
fwh_order_dict = {}
fwh_order_id_list, fwh_order_sn_list = [], []
if data!=():
for a in data:
fwh_order_id=a['order_id']
fwh_order_sn=a['order_sn']
fwh_order_id_list.append(fwh_order_id)
fwh_order_sn_list.append(fwh_order_sn)
fwh_order_dict['fwh_order_id']=fwh_order_id_list
fwh_order_dict['fwh_order_sn']=fwh_order_sn_list
# print("put %s to queue...." % (fwh_order_dict))
q.put(fwh_order_dict) return q.qsize()#返回队列数量 def asynchronousPay_process(q,order_id,order_sn):
if (data!=()):
url_wechat_success_huidiao=fwh_test_api+'/index/Order/doWeChatNotify'
data_wechat_success_huidiao=data_to_str.requestDataToStr_firefoxAndChrome_fwh('''order_sn:{}
order_id:{}
meth_id:4
timestamp:157129653969
sign:0687b01b300b9e300d3996a9d2173f1380973e5a'''.format(order_sn,order_id))
# print(data_wechat_success_huidiao)
request_wechat_success_huidiao=requests.post(url=url_wechat_success_huidiao,headers=headers_form_urlencoded,data=data_wechat_success_huidiao)
response_wechat_success_huidiao=request_wechat_success_huidiao.json()
if '订单状态错误,非待支付订单' in response_wechat_success_huidiao['msg']:
print(data_wechat_success_huidiao)
# print(request_wechat_success_huidiao.json())
else:
print('待支付订单为空') def run_multiprocess():
p = Pool(9)
q = Manager().Queue()
size = list(range(testDoWeChatNotify(q)))
info = q.get()
for i in range(len(info['fwh_order_id'])):
lock.acquire()#加互斥锁
# print('当前进程{},父进程id{}'.format(os.getpid(),os.getppid()))
p.apply_async(func=asynchronousPay_process,
args=(q, info['fwh_order_id'][i], info['fwh_order_sn'][i]))
lock.release()#解锁 p.close()
p.join() if __name__=="__main__":
start_time = time.time() # 计算程序开始时间
run_multiprocess()
# q=Manager().Queue()
# size = list(range(testDoWeChatNotify(q)))
# info = q.get()
# for i in range(len(info['fwh_order_id'])):
# asynchronousPay_process(q,info['fwh_order_id'][i], info['fwh_order_sn'][i])
print('程序耗时{:.2f}'.format(time.time() - start_time)) # 计算程序总耗时

思路:与多线程实现思路差不多,但是所用模块不同,多进程用multiprocessing模拟,多线程用therading模块
多进程队列使用multiprocessing.Queue()或者multiprocessing.Manager().Queue(),多线程使用queue.Queue(),apply_async方法是apply方法的非阻塞式(异步)版本,Queue引入确实提高了执行速度,亲测:为使用多进程前支付100个订单用了四十多秒,使用之后用了5.x秒,
这根电脑的性能会有一些关系!
问题:
  1.在调试的过程中我想用一个封装一个类来完成,但是调试了很久,都有问题(队列无法公用的问题),忘大佬指教;
  2.线程启动的数量更多(进程启动了8个,线程启动了100个),为啥会没有多进程的执行速度快?(同时使用join的情况下),这里修正一下,多线程执行速度会快一些,因为代码跟运行速度不一致所以造成了这种错觉
  3.会出现重复请求的请求,但是只会有一次(我创建了八个进程,为什么只会重复一次)




python多进程完成模拟支付的更多相关文章

  1. Python实现支付宝在线支付

    windows系统安装Python虚拟环境 首先保证你的系统已经安装好了Python 安装virtualenv C:\WINDOWS\system32>pip3 install virtuale ...

  2. python多进程与多线程编程

    进程(process)和线程(thread)是非常抽象的概念.多线程与多进程编程对于代码的并发执行,提升代码运行效率和缩短运行时间至关重要.下面介绍一下python的multiprocess和thre ...

  3. Python多进程与多线程编程及GIL详解

    介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...

  4. Python多进程库multiprocessing创建进程以及进程池Pool类的使用

    问题起因最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果.没错!类似bag ...

  5. Python多进程编程

    转自:Python多进程编程 阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiproces ...

  6. Python多进程(1)——subprocess与Popen()

    Python多进程方面涉及的模块主要包括: subprocess:可以在当前程序中执行其他程序或命令: mmap:提供一种基于内存的进程间通信机制: multiprocessing:提供支持多处理器技 ...

  7. Python多进程使用

    [Python之旅]第六篇(六):Python多进程使用   香飘叶子 2016-05-10 10:57:50 浏览190 评论0 python 多进程 多进程通信 摘要:   关于进程与线程的对比, ...

  8. Python使用mechanize模拟浏览器

    Python使用mechanize模拟浏览器 之前我使用自带的urllib2模拟浏览器去进行訪问网页等操作,非常多站点都会出错误,还会返回乱码.之后使用了 mechanize模拟浏览器,这些情况都没出 ...

  9. python多进程断点续传分片下载器

    python多进程断点续传分片下载器 标签:python 下载器 多进程 因为爬虫要用到下载器,但是直接用urllib下载很慢,所以找了很久终于找到一个让我欣喜的下载器.他能够断点续传分片下载,极大提 ...

  10. Python多进程multiprocessing使用示例

    mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multipr ...

随机推荐

  1. 服务器上运行 xvbf 时报错 —— Unknown encoder 'libx264'

    解决方法: 使用conda环境(不具体交代) conda install ffmpeg 成功运行:

  2. 在单机条件下,MPI4PY与纯Python多进程代码来比较是否有性能优势???

    如题: 最近在看MPI4PY的代码,但是发现这东西除了编写简洁外(少量代码实现复杂的多进程通信,包括单机和多机),好像也没有别的太多功能,当然MPI本身在多机通信广播.规约上做的很成熟,但是假设我们只 ...

  3. sublime 快速生成html基础代码

    一.快速生成HTML5的头部信息的步骤: 1.Ctrl + N,新建一个文档: 2.Ctrl + Shift + P,打开命令模式,再输入 sshtml 进行模糊匹配,将语法切换到html模式: 3. ...

  4. SpringBoot 整合线程池

    分为三步 启动类加 @EnableAsync 注解 在方法上加 @Async 注解 创建线程池配置类 1.启动类加 @EnableAsync 注解 @SpringBootApplication @En ...

  5. worktree的路径的文件夹自己重命名后发现没有git

    1. worktree title: worktree的路径的文件夹自己重命名(修改名称)后发现没有git了 keyword: git worktree repair prune 快速方法 问题:父级 ...

  6. Linux CentOS 7 安装 Kafka 2.8.2 - 单机版 & JDK 11 & 切换 JDK版本

    目录 安装 JDK 11 安装 Kafka 下载 Kafka 2.8.2 防火墙 修改配置 运行测试 自启动 验证端口 Kafka 从 2.6.0 开始,默认使用 Java 11 , 3.0.0 开始 ...

  7. Clion+OpenCV(C++版)开发环境配置教程WinMac

    Clion+OpenCV(C++版)开发环境配置教程Win/Mac 平时在学习和比赛的时候都是使用的Python版本的OpenCV,最近遇到了一个项目使用的上位机性能有限于是决定视觉方面使用C++的O ...

  8. Kubernetes-4:kubectl常用命令总结

    kubectl常用命令 1.kubectl get 显示资源 ## 查看pod列表,若pod后不指定名称空间(namespace),则默认为default名称空间 kubectl get pod ## ...

  9. vue自定义组件的点击事件失效

    在vue开发过程中为了减少重复代码,很多时候都需要将重复的部分写成一个组件,方便调用.但是使用组件时很可能又会给该组件添加点击事件.如果直接这样写,事件则会失效: 正确写法应该是这样:

  10. CSS – Box Shadow & Text Shadow

    前言 之前在 CSS – W3Schools 学习笔记 (3) 介绍过这个功能, 但一直不熟练. 每次用都卡卡的, 估计是没有写一篇独立的笔记的缘故. 特此写一篇. Text Shadow 下面这个是 ...