python多线程发送socket数据,主线程保持接收状态,settimeout()的相关用法

转载:http://codego.net/9140379/

有点乱后期在做整理

1.在非阻塞套接字没有数据可用的情况下,recv的会抛出异常socket.error和异常的价值将要么EAGAIN或者EWOULDBLOCK的错误号。例如:

import sys
import socket
import fcntl, os
import errno
from time import sleep
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((‘127.0.0.1‘,9999))
fcntl.fcntl(s, fcntl.F_SETFL, os.O_NONBLOCK)
while True:
 try:
  msg = s.recv(4096)
 except socket.error, e:
  err = e.args[0]
  if err == errno.EAGAIN or err == errno.EWOULDBLOCK:
   sleep(1)
   print ‘No data available‘
   continue
  else:
   # a "real" error occurred
   print e
   sys.exit(1)
 else:
  # got a message, do something :)

这种情况在该情况下,有一点不同,你已经通过了出去启用非阻塞行为s.settimeout(n)。在这种情况下,socket.error是史迪威提出,但在一列的情况下,异常的值始终设置为“出”的字符串。因此 CodeGo.net,要处理这种情况,你可以这样做:

import sys
import socket
from time import sleep
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((‘127.0.0.1‘,9999))
s.settimeout(2)
while True:
 try:
  msg = s.recv(4096)
 except socket.timeout, e:
  err = e.args[0]
  # this next if/else is a bit redundant, but illustrates how the
  # timeout exception is setup
  if err == ‘timed out‘:
   sleep(1)
   print ‘recv timed out, retry later‘
   continue
  else:
   print e
   sys.exit(1)
 except socket.error, e:
  # Something else happened, handle error, exit, etc.
  print e
  sys.exit(1)
 else:
  if len(msg) == 0:
   print ‘orderly shutdown on server end‘
   sys.exit(0)
  else:
   # got a message do something :)

如指出的,这也是一种更轻便的解决方案,因为它不依赖于OS的特定函数,以将sockets插入非blockng模式。
 请参阅recv(2)和Python接口的更多细节。
2.
这很简单:如果recv()您将不会收到这方面的任何更多的数据。永远。您可能仍然能够发送。
 您的非阻塞套接字必须抛出一个异常(可能是依赖于系统的)如果没有可用数据,但连接仍然活着(另一端可以发送)。
3.
当recv在连接select如果套接字准备好被读取,但没有数据读取客户端端已经关闭了连接。
 这里是处理这段代码,还要注意,当抛出异常recv被称为第二个while循环。如果没有什么留下来读这将引发异常没有关系“客户端端已经关闭了连接:
def listenToSockets(self):
 while True:
  changed_sockets = self.currentSockets
  ready_to_read, ready_to_write, in_error = select.select(changed_sockets, [], [], 0.1)
  for s in ready_to_read:
   if s == self.serverSocket:
    self.acceptNewConnection(s)
   else:
    self.readDataFromSocket(s)
和接收数据的函数:
def readDataFromSocket(self, socket):
 data = ‘‘
 buffer = ‘‘
 try:
  while True:
   data = socket.recv(4096)
   if not data:
    break
   buffer += data
 except error, (errorCode,message):
  # error 10035 is no data available, it is non-fatal
  if errorCode != 10035:
   print ‘socket.error - (‘+str(errorCode)+‘) ‘ + message

 if data:
  print ‘received ‘+ buffer
 else:
  print ‘disconnected‘

只是现有的答案,我会选择,而不是非阻塞套接字。问题是,非阻塞的东西(也许除了发送),所以我会说,没有理由他们。如果你经常有你的应用程序被阻塞,等待IO的问题,我也会考虑做IO在背景中一个单独的线程。
时间: 2024-07-29 09:06:21

python多线程发送socket数据,主线程保持接收状态,settimeout()的相关用法的相关文章

python 多线程中子线程和主线程相互通信

主线程开启多个线程去干活,每个线程需要完成的时间不同,干完活以后都要通知给主线程,下面代码说明该应用: 代码块: import threading import queue import time import random ''' 需求:主线程开启了多个线程去干活,每个线程需要完成的时间 不同,但是在干完活以后都要通知给主线程 多线程和queue配合使用,实现子线程和主线程相互通信的例子 ''' q = queue.Queue() threads=[] class MyThread(threa

python多线程(等待)主线程和子线程的同步执行

#!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time def fun(name, ls_name, front_thread = None): ''' 线程启动函数 通过front_thread来使用线程有序的运行 ''' time.clock() time.sleep(2) # 如果front_thread存在,则在front_thread运行完成后,才运行当前线程 if front_thread

Delphi7从子线程中发送消息到主线程触发事件执行

[转载]Delphi7从子线程中发送消息到主线程触发事件执行 在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上(可视),同时进行日志处理等.我用的是下面的方法: [1]用到的API函数: RegisterWindowsMessage ---------------------- 函数功能:该函数定义一个新的窗口消息,该消息确保在系统中是唯一的.返

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

Python多线程、进程、协程

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

python多线程、多进程、协程的使用

本文主要介绍多线程.多进程.协程的最常见使用,每个的详细说明与介绍有时间会在以后的随笔中体现. 一.多线程 1.python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的.原始的线程以及一个简单的锁.threading通过对thread模块进行二次封装,提供了更方便的API来操作线程.接下来只介绍threading的常见用法. 2.使用 import threading import time def Traversal_5(interval): fo

多线程发送icmp数据包(Python版)

做icmp攻击时,先用Python写了发送数据包的函数. 发送数据包用的是scapy模块,需要先安装:apt-get install python-scapy ''' date:2014/12/3 author:yss function:send packets from host to server with multithreading ''' import threading from time import sleep,ctime from scapy.all import * num=

Python爬虫案例演示:Python多线程、多进程、协程

很多时候我们写了一个爬虫,实现了需求后会发现了很多值得改进的地方,其中很重要的一点就是爬取速度.本文 就通过代码讲解如何使用 多进程.多线程.协程 来提升爬取速度.注意:我们不深入介绍理论和原理,一切都在代码中. 二.同步 首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程.下面代码的目的是访问300次百度页面并返回状态码,其中 parse_1 函数可以设定循环次数,每次循环将当前循环数(从0开始)和url传入 parse_2 函数. import requests def pars

python 多线程 并发socket实例

sever side: import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): '''try内的代码就是要实现的功能,目前是实现小写转大写,可以自定义, try是在客户端结束时不报错 ''' try: while True: self.data = self.request.recv(1024).strip() print("{} wrote:".format(